managedQuery 和 getContentResolver().query的区别
但是 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的区别相关推荐
- 在managedQuery()和getContentResolver().query()方法中实现结果去重
有时候,我们需要对查询的数据库结果进行去重.在SQL中我们可以通过distinct关键字实现,但是当我们使用android提供的managedQuery()或getContentResolver(). ...
- getContentResolver().query()方法selection参数使用详解(转)
如何在managedQuery()和getContentResolver().query()方法中实现结果去重 有时候,我们需要对查询的数据库结果进行去重.在SQL中我们可以通过distinct关键字 ...
- android 相册 uri空,Android---相册getContentResolver().query结果为空指针
针对小米4手机上测试如下代码: Uri uri = data.getData(); String[] proj = {MediaStore.Images.Media.DATA}; //Cursor c ...
- SQVI和SAP查询QUERY的区别和使用注意事项
SQVI.SAP查询QUERY都适用于简单的表连接数据查询,但都不能打包传输到PRD,不同环境需要重复创建.可以生成报表程序供T-CODE调用,用se93指定事务码和程序名称.区别1-权限:SQVI每 ...
- params和query的区别
params和query的区别 引入方式不同: query要使用path来引入,params要使用name来引入,接受参数格式类似,引用分别是this.route.query.name和this.ro ...
- managedQuery和query的区别,
我们都知道在Android系统中,SQLite数据库的相关操作方式被封装为内容提供Content Provider,可以帮助那些不会SQL语言的开发者快速实现Android平台上的数据库操作,但是平时 ...
- context.getContentResolver().query()详细用法详解
1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NAME. [java] view plain copy public void fetchAllContacts() ...
- vue中params和query的区别,以及具体用法
query传递参数会在url后面用?连接起来,且参数之间用&&符号连接然后显示在页面的url中:params传递参数不会显示在页面中:query有点像ajax中的get请求,而para ...
- vue router 的路由传参 params 和 query 的 区别
1. 不带参数<router-link :to="{name:'home'}"> <router-link :to="{path:'/home'}&qu ...
最新文章
- Silverlight实例教程 - Out of Browser的自定义应用
- 网易云信实时音频框架背后:算法优化带来产品体验全面提升
- 创建sdcard.img时,提示permission dennid
- 我如何转行为程序员?心态支撑着我
- 二维码生成器如何制作圆形二维码
- 抖音Vlog必备1000+超强Premiere转场特效字幕动画LUT预设PR模板包 V6 (包含音效)
- 12月21诛仙服务器维护,12月24日全服停机更新维护公告
- ORA-20001: Invalid or inconsistent input values
- 数字人民币专利数激增, “区块链”领域大有可为
- flash 图表(XML动态获取数据)
- 不要嘀咕自己对新环境的适应能力
- JSON简介:什么是JSON?
- 第一章 README
- 关于MOTOROLA O202C无线座机 来电响一声故障
- java制作媒体播放器_用Java构造自己的媒体播放器
- 十七.用户注册 ---- 图形验证码 2021-04-03
- 20秋PHP作业3,兰大《网页与网站设计》20秋平时作业3满分
- lettuce MGET性能分析
- [转载]安达卢西亚大冒险—绝壁龙达
- CDH大数据平台搭建之JDK安装