getContentResolver.query 和 managedQuery 的区别
来源:互联网 发布:语音读书软件下载 编辑:程序博客网 时间:2024/06/06 14:14
对于Android数据库查询语句的问题
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
操作,则这两个的效果就完全一样了。
String value = "";String path = "";path = "content://aaa/bbb";Uri uri = Uri.parse(path + "/" + key);Cursor mCursor = context.getContentResolver().query(uri, null,null, null, null);if (mCursor != null) { while (mCursor.moveToNext()) { value = mCursor.getString(mCursor.getColumnIndex("value")); // Log.e("Leo", key + "=" + value); } mCursor.close();}
- getContentResolver().query 和 managedQuery 的区别
- getContentResolver().query 和 managedQuery 的区别
- getContentResolver().query 和 managedQuery 的区别
- getContentResolver().query 和 managedQuery 的区别
- managedQuery 和 getContentResolver().query的区别
- getContentResolver.query 和 managedQuery 的区别
- 如何在managedQuery()和getContentResolver().query()方法中实现结果去重
- 如何在managedQuery()和getContentResolver().query()方法中实现结果去重
- 如何在managedQuery()和getContentResolver().query()方法中实现结果去重
- 如何在managedQuery()和getContentResolver().query()方法中实现结果去重
- 如何在managedQuery()和getContentResolver().query()方法中实现结果去重
- 如何在managedQuery()和getContentResolver().query()方法中实现结果去重
- 如何在managedQuery()和getContentResolver().query()方法中实现结果去重
- android中的managedQuery和Query
- managedQuery & query
- Android Query & managedQuery
- Android Query & managedQuery
- Query.list()和Query.iterator()的区别
- python 日志打印之logging使用介绍
- Android源码设计模式解析与实战阅读讨论
- 在Android Studio中进行代码混淆
- Unity遊戲在上架送審前常見問題整理(Xcode)
- 如果一个程序同时链接了MSVCRT.lib和libcmt.lib回出现函数重定义错误
- getContentResolver.query 和 managedQuery 的区别
- subclipse 的下载地址
- Retrofit & OkHttp系列(一)
- 大数据与JS实现2014巴西世界杯冠军预测图
- 源码推荐:自定义下拉刷新动画 弹性的分段选择控件
- android 圆环(ring)drawable 画法 ——简单记录
- hdu1071定积分
- 牛客网刷题之序列化二叉树
- java生成pdf(Itext)