`
zhifeiji512
  • 浏览: 115129 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android中Cursor关闭的问题

阅读更多


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 楼 zhifeiji512 2011-09-14  
George_ghc 写道
第一段代码给cursor赋值
第二段代码又给cursor赋值 ,
此时会有内存泄露问题!


不明白,你指的是哪里

相关推荐

    android在异步任务中关闭Cursor的代码方法

    android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现

    Android App调试内存泄露之Cursor篇

    最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露,比如静态变量,cursor关闭,线程,定时器,反注册,bitmap等等,我稍微统计并总结了一下,当然了,这些问题...

    Android查单词-集成英文词典和联系人.rar

    一个运行android手机的小程序,Android查单词-集成了英文词典和联系人信息,在文本框中输入需要查询的词即可以使用。在联系人列表中,单击选项菜单可删除联系人,这几个操作的具体代码为:  public boolean ...

    Android创建和使用数据库详细指南.doc

    import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public ...

    android连接SQLite数据库源代码

    android内部有缓存可关闭也不关闭也行,查询rawQuery是方法 3.在分页有到Cursor(游标)取游标下一个值cursor.moveToNext(),用游标对象接数据 "select * from person limit ?,?" person不能加上where 关键字 4.在...

    Android个人通讯录

    最近写数据库,我就自己写了个带密码的个人通讯录,感觉sqlite特别好用,和mysql,sqlserver都一样,真是简单的关系型数据库,注意:开启数据库,cursor后一定要记得关闭close()掉,避免浪费资源。另外adapter的...

    android-priority-jobqueue-2.0.2_kevin

    修复android-priority-jobqueue-2.0.1这个开源库cursor没关闭的BUG

    Android开发资料合集-World版!

    4.1.1、图案填充问题 48 4.2、TEXTVIEW 49 4.2.1、动态滚动 49 4.3、EDITTEXT 49 4.3.1、光标选择 49 4.4、TITLEBAR 50 4.4.1、非全屏状态下不显示title标题栏 50 4.4.2、标题栏进度指示器 50 4.4.3、titleBar 高级...

    Android 开发技巧

    4.1.1、图案填充问题 48 4.2、TEXTVIEW 49 4.2.1、动态滚动 49 4.3、EDITTEXT 49 4.3.1、光标选择 49 4.4、TITLEBAR 50 4.4.1、非全屏状态下不显示title标题栏 50 4.4.2、标题栏进度指示器 50 4.4.3、titleBar 高级...

    浅析Android手机卫士读取联系人

    浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 获取ContentResolver内容解析器对象,通过getContentResolver()方法 调用ContentResolver对象的query()方法,得到raw_contacts表里面的数据...

    Android 内存泄漏的几种可能总结

    Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩溃,同时防止未释放的内存把堆栈(heap)挤爆的可能,...(译者注:Cursor忘记关闭等) 逻辑内存泄

    Android工程师面试题大全

    他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。 SQLiteCursor,当数据量大的时候容易泄露 2)、使用Adapter时,没有使用系统缓存的converview。 3)、即时调用recycle()释放不再使用的Bitmap。 适当...

    Android内存泄漏的八种可能

    Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentationfault)导致崩溃,同时防止未释放的内存把堆栈(heap)挤爆的...(译者注:Cursor忘记关闭等)逻辑内存泄漏(logica

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--android中anim文件特效 |--app信息menifest获取(如版本号) |--AsyncQueryHandler之异步查询Cursor处理 |--AutoCompleteTextView自动提示的用法 |--BitMap、Drawable、inputStream及byte[] 互转 |--...

    SQLiteDemo

    import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteException; import ...

    SQLite Demo

    Android平台下数据库相关类: SQLiteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等操作函数。 SQLiteDatabase 数据库访问类:...SQLiteCursor 查询结构操作类:用来访问查询结果中的记录。

Global site tag (gtag.js) - Google Analytics