阅读更多


Android中Cursor关闭的问题


    Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cusor最终会被释放掉。

    然而如果Cursor的数据量特表大,特别是如果里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC来处理。并且Android明显是倾向于编程者手动的将Cursor close掉,因为在源代码中我们发现,如果等到垃圾回收器来回收时,会给用户以错误提示。

    所以我们使用Cursor的方式一般如下:

Cursor cursor = null;try{    cursor = mContext.getContentResolver().query(uri,null,null,null,null);    if(cursor != null){        cursor.moveToFirst();    //do something    }}catch(Exception e){    e.printStatckTrace();}finally{    if(cursor != null){        cursor.close();    }}
 


    有一种情况下,我们不能直接将Cursor关闭掉,这就是在CursorAdapter中应用的情况,但是注意,CursorAdapter在Acivity结束时并没有自动的将Cursor关闭掉,因此,你需要在onDestroy函数中,手动关闭。

 

 

@Override  protected void onDestroy() {            if (mAdapter != null && mAdapter.getCurosr() != null) {          mAdapter.getCursor().close();      }      super.onDestroy();   }
 

    CursorAdapter中的changeCursor函数,会将原来的Cursor释放掉,并替换为新的Cursor,所以你不用担心原来的Cursor没有被关闭。

   你可能会想到使用Activity的managedQuery来生成Cursor,这样Cursor就会与Acitivity的生命周期一致了,多么完美的解决方法!然而事实上managedQuery也有很大的局限性。

    managedQuery生成的Cursor必须确保不会被替换,因为可能很多程序事实上查询条件都是不确定的,因此我们经常会用新查询的Cursor来替换掉原先的Cursor。因此这种方法适用范围也是很小。

 

 

 

 

 

 

 

 

更多相关文章

  1. Android系统触摸屏的校正——http://carvencao.blog.sohu.com/15
  2. 腾讯T3大牛带你了解 2019 Android开发趋势及必备技术点!
  3. 基于Android的校园跳蚤市场(二手)的设计与实现
  4. 我也分享一下我Android的收入数据
  5. 曝Android机冷冻后变"傻" 加密数据随意访问
  6. Android之利用JSBridge库实现Html,JavaScript与Android的所有交互
  7. Android入门篇二:使用意图在Activity之间传递数据
  8. Android使用JNI实现Java与C之间传递数据
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. Android(安卓)如何获取SDCard 内存(二)
  2. Android(安卓)创建文件路径这件事,你也可
  3. Android开发插件的下载与安装
  4. python服务器与android客户端socket通信
  5. Android麦克风录音的实现
  6. Android(安卓)studio中关于Spinner下拉列
  7. Android中判断手机是否联网实例
  8. Android(安卓)2.3.5 手动修改透明状态栏
  9. Android中的oast的使用
  10. 隐藏键盘二-----隐藏的同时还要接受其他