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.

而query 出自android.content.ContentResolver.query,其实managedQuery的内部实现是调用了query,只是在query的基础上,加上了startManagingCursor操作,以管理获取的cursor。因此,若是只用query,且对于query返回的cursor没有进行管理的话,会造成内存的泄露问题等等。但是若是用了query后,有对返回的cursor进行了startManagingCursor操作,则这两个的效果就完全一样了。

managedQuery 和 getContentResolver().query的区别相关推荐

  1. 在managedQuery()和getContentResolver().query()方法中实现结果去重

    有时候,我们需要对查询的数据库结果进行去重.在SQL中我们可以通过distinct关键字实现,但是当我们使用android提供的managedQuery()或getContentResolver(). ...

  2. getContentResolver().query()方法selection参数使用详解(转)

    如何在managedQuery()和getContentResolver().query()方法中实现结果去重 有时候,我们需要对查询的数据库结果进行去重.在SQL中我们可以通过distinct关键字 ...

  3. android 相册 uri空,Android---相册getContentResolver().query结果为空指针

    针对小米4手机上测试如下代码: Uri uri = data.getData(); String[] proj = {MediaStore.Images.Media.DATA}; //Cursor c ...

  4. SQVI和SAP查询QUERY的区别和使用注意事项

    SQVI.SAP查询QUERY都适用于简单的表连接数据查询,但都不能打包传输到PRD,不同环境需要重复创建.可以生成报表程序供T-CODE调用,用se93指定事务码和程序名称.区别1-权限:SQVI每 ...

  5. params和query的区别

    params和query的区别 引入方式不同: query要使用path来引入,params要使用name来引入,接受参数格式类似,引用分别是this.route.query.name和this.ro ...

  6. managedQuery和query的区别,

    我们都知道在Android系统中,SQLite数据库的相关操作方式被封装为内容提供Content Provider,可以帮助那些不会SQL语言的开发者快速实现Android平台上的数据库操作,但是平时 ...

  7. context.getContentResolver().query()详细用法详解

    1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NAME. [java]  view plain copy public void fetchAllContacts()  ...

  8. vue中params和query的区别,以及具体用法

    query传递参数会在url后面用?连接起来,且参数之间用&&符号连接然后显示在页面的url中:params传递参数不会显示在页面中:query有点像ajax中的get请求,而para ...

  9. vue router 的路由传参 params 和 query 的 区别

    1. 不带参数<router-link :to="{name:'home'}"> <router-link :to="{path:'/home'}&qu ...

最新文章

  1. Silverlight实例教程 - Out of Browser的自定义应用
  2. 网易云信实时音频框架背后:算法优化带来产品体验全面提升
  3. 创建sdcard.img时,提示permission dennid
  4. 我如何转行为程序员?心态支撑着我
  5. 二维码生成器如何制作圆形二维码
  6. 抖音Vlog必备1000+超强Premiere转场特效字幕动画LUT预设PR模板包 V6 (包含音效)
  7. 12月21诛仙服务器维护,12月24日全服停机更新维护公告
  8. ORA-20001: Invalid or inconsistent input values
  9. 数字人民币专利数激增, “区块链”领域大有可为
  10. flash 图表(XML动态获取数据)
  11. 不要嘀咕自己对新环境的适应能力
  12. JSON简介:什么是JSON?
  13. 第一章 README
  14. 关于MOTOROLA O202C无线座机 来电响一声故障
  15. java制作媒体播放器_用Java构造自己的媒体播放器
  16. 十七.用户注册 ---- 图形验证码 2021-04-03
  17. 20秋PHP作业3,兰大《网页与网站设计》20秋平时作业3满分
  18. lettuce MGET性能分析
  19. [转载]安达卢西亚大冒险—绝壁龙达
  20. CDH大数据平台搭建之JDK安装

热门文章

  1. 斯德哥尔摩的照片六:旧城(下)
  2. python 魔兽世界升级脚本_Python 实现数据库更新脚本的生成方法
  3. BIOS设置与硬盘分盘
  4. 为什么越来越多大学生沉溺于游戏中? ---游戏设计思路
  5. 怎么会人人都是智者呢?
  6. ios10怎么设置电池颜色_iOS10省电设置技巧 iOS10怎么最省电
  7. 非常有创意的营销方案,商城只用1个月就做到1500万营业额!
  8. INTERVAL记录
  9. stos dword ptr es:[edi]是什么意思
  10. mysql创建用户变量_MySQL创建一个变量的用户?