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

相关推荐

  • hive RegexSerDe View

    hive RegexSerDe View

    2022年1月14日
  • C# winform开发界面美化

    C# winform开发界面美化总述winform属于比较老的桌面程序开发框架,由于它的易用性常用于一些测试软件、工控软件的开发,界面的美观是其存在的比较大的问题,自带的控件普遍比较不美观,下面介绍一下一些第三方的组件库。CSkin使用方法导入官网下载的dll链接库即可使用,导入后会在左边的组件框生成组件。组件效果SunnyUI使用方法导入dll链接库可用,下载连接组件效果NetWinform使用方法代码开源,可直接使用代码,或者NuGetInstall-PackageHZH_Controls,下载路径

    2022年5月8日
  • 一文详解MOS管驱动电路的核心设计「建议收藏」

    一文详解MOS管驱动电路的核心设计「建议收藏」MOS管电子产品生产中不可或缺的重要保护器件,在手机、笔记本电脑、蓝牙耳机等都有MOS管的身影,可以这样说,有便携式电子产品的地方一定有MOS管的存在,究竟为何MOS管能在竞争激烈的电子行业中脱颖而出,我觉的最主要的原因莫过于MOS管绝佳的性能,如简化驱动电路、自适应能力强、抗干扰能力强等性能使得MOS管崛起的速度快,今天我们要说的是MOS管在驱动电路中的核心设计,为何能让MOS管在竞争如此激烈的…

    2022年6月19日
  • python有序列表_python有序列表以及方法的介绍(代码)

    python有序列表_python有序列表以及方法的介绍(代码)本篇文章给大家带来的内容是关于python有序列表以及方法的介绍(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。有序列表以及有序列表的函数和方法(list)list=[‘hello’,’wrold’]#len获取查询长度length=len(list)#append添加一个新元素,到list的末尾list.append(‘admin’)#pop删除指定位…

    2022年6月16日
  • substring截取字符串特定位置的值

    substring截取字符串特定位置的值1、截取指定字符上的字符串:substring(start,end)start:开始的位置(从0开始索引)包括该位置的字符,不可省略end:结束的位置(不包括该位置上的字符),可省略例:Stringstr=“第1周”;str=str.substring(1,2);str此时里面就剩一个1了若start与end相等,那么返回的就是一个空串若start比end大…

    2022年5月23日
  • Linux终止进程的工具kill/killall/pkill/xkill/skill用法区别(转)

    Linux终止进程的工具kill/killall/pkill/xkill/skill用法区别(转)

    2022年3月5日

发表回复

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

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