用 managedQuery() 时须要注意的一个陷阱

用 managedQuery() 时须要注意的一个陷阱

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Activity 里面提供了一个 managedQuery() 方法,依照 Android SDK 里面的说明,“the activity will manage its lifecycle for you.” 听起来非常好,Activity 能够替你管理 Cursor 的生命周期了,就不用记着去 close() 了,代码能够更简洁。

可是 Activity 是怎么去管理 Cursor 的生命周期的呢?SDK 文档没说。近期遇到一个 bug,在一个 Activity 中,用 managedQuery() 查询数据库,将查询得到的 Cursor 用 CursorAdapter 与 ListView 绑定。然后在 Activity 里面运行批量删除数据表记录操作,由于耗时比較长,所以用了多线程处理。測试团队发现的 bug 是,在删除操作进行过程中,假设按下 Home 键,应用就崩溃了。崩溃原因是 Cursor 被释放了,导致工作线程的删除操作异常。

看了 Activity.java 的源代码之后就明确为什么会崩溃了。managedQuery() 事实上无非就是把查询得到的 Cursor 放到了 Activity 类的一个数组成员变量中,然后当 Activity stop 的时候,将这个数组里的每一个 cursor 都关掉,以及在 resume 的时候,将数组里的每一个 cursor 都又一次查询一次。所以在按下 Home 键之后,Activity 被 stop 了,cursor 也就被关闭了,假设有个线程还在继续使用这个 cursor,就会抛异常了。

因此,在用 managedQuery() 的时候,须要清楚 cursor 什么时候会被释放,并考虑好自己的代码在 cursor 被释放后不再须要使用这个 cursor.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118268.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言xml解析器libxm2

    c语言xml解析器libxm2写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言;2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换;3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详细介绍如何在windows平台下进行编程,更很少提到如

    2022年7月12日
    55
  • Android百度地图获取开发版SHA1值和发布版SHA1值

    Android百度地图获取开发版SHA1值和发布版SHA1值开发版SHA1获取:首先找到C:\Users****.android文件夹,在.android文件下打开当前文件夹的控制台,输入keytool-v-list-keystoredebug.keystore即可,遇到输入口令,一般默认为android,如图:发布版SHA1获取:首先创建该项目,并打开AndroidStudio选中Build->GenerateS…

    2022年8月10日
    8
  • 互联网协议 — ECMP 等价多路径路由

    互联网协议 — ECMP 等价多路径路由目录文章目录目录 ECMPECMP 的不足 UCMP Unequalcostm 非等价多路径 ECMPECMP EqualCostMul 等价多路径路由 即 当 IP 路由网络中存在多条到达同一个 dstIP 且开销相等的 RoutePaths 时 如果路由器设备支持等价路由协议 那么发往该 dstIP 或者 dstSubnet 的三层转发流量就可以通过不同的路径分担 实现网络链路级别的负载均衡 并在链路出现故障时 实现快速切换 OSPF ISIS EI

    2025年10月26日
    4
  • EJB学习笔记一(EJB概述)

    EJB学习笔记一(EJB概述)1.前言从今天开始,简单的学习一下有关EJB方面的知识.从自己看EJB有关方面的书籍来看,感觉跟市面上的Spring很像,后来才发现,整个Spring框架实际上是参考了EJB的设计理念,由于学习过Spring,所以现在学习EJB的相关知识,并不是很吃力.接下来会在几篇博客中,简单的书写一下,自己的EJB的认识. 2.什么是EJBEJB全名为EnterpriseJa

    2022年9月30日
    3
  • PHP处理字符中的emoji表情

    PHP处理字符中的emoji表情

    2022年2月14日
    73
  • nohup和&的区别

    nohup和&的区别转自:nohup和&的区别http://bbs.nanjimao.com/thread-470-1-1.html(出处:南极猫)nohup是永久执行&是指在后台运行运行n

    2022年7月3日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号