用 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • InetAddress IP地址类

    InetAddress IP地址类InetAddress类一.InetAddress类:InetAdderss类是JDK中提供了一个类,该类用于封装一个IP地址,并提供了一系列与IP地址相关的方法。二.常用方法:常用方法staticInetAddressgetByName(Stringhost)—-在给定主机名的情况下确定主机的IP地址staticInetAddressgetLo…

    2022年6月23日
    21
  • 【伪装位置神器】神行者AnyLocation 1.3.0001可用于微信,陌陌

    【伪装位置神器】神行者AnyLocation 1.3.0001可用于微信,陌陌软件名称:神行者(激活成功教程)软件版本:v1.3.0001授权类别:免费测试机型:大可乐手机下载链接:http://pan.baidu.com/s/1qWwSMde密码:m7mq应用简介:神行者Any

    2022年8月2日
    5
  • android 系统签名

    android 系统签名最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份。   安装在设备中的每一个apk文件,Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID在应用程序安装到设

    2022年6月21日
    26
  • 用一份JAVA工程师的求职简历来说说求职简历怎么写[通俗易懂]

    用一份JAVA工程师的求职简历来说说求职简历怎么写[通俗易懂]这是一篇我比较想看到的简历指导的文章。但是我比较反对简历造假。我觉得会什么写什么把。Java就业指导  想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些内容写到你的简历中,当然更需要的是你在面试的时候向面试官展示这些专业技能。相信此文…

    2022年9月23日
    0
  • linux initramfs,Linux INITRAMFS 与 INITRD「建议收藏」

    linux initramfs,Linux INITRAMFS 与 INITRD「建议收藏」initramfs文件生效的过程大致分为四步:第一步:Kernel首先要注册一个RAMFS文件系统类型(实际注册的类型名称是”ROOTFS”,后续我们可以看到它实际上就是”RAMFS”);第二步:然后加载(mount)一个空的rootfs文件系统,类型就是上面提到的RAMFS(ROOTFS);第三步:寻址initramfs文件“XXX.cpio.gz”并解压到已mount的rootfs文件系统中;…

    2022年8月11日
    7
  • MySQL update回滚 mysqlbinlog回复数据

    MySQL update回滚 mysqlbinlog回复数据

    2022年2月14日
    162

发表回复

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

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