`
zhifeiji512
  • 浏览: 119298 次
  • 性别: 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 是一个非常重要的类,主要用于处理数据查询结果。它提供了一个简洁的方法来访问数据库查询的结果集,并允许开发者方便地遍历这些结果。对于新手而言,理解 Cursor 的工作原理以及如何正确...

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

    本文将详细介绍如何在Android异步任务中正确地管理和关闭Cursor。 首先,让我们理解异步任务(AsyncTask)的基本概念。AsyncTask是一个轻量级的后台处理组件,它允许我们在后台线程执行计算密集型任务,并在UI线程...

    Android App调试内存泄露之Cursor.zip

    在Android应用开发中,内存泄漏是...通过理解和应用上述技巧,开发者可以有效地防止和解决Android应用中的Cursor内存泄漏问题,提高应用的性能和稳定性。同时,定期进行内存分析和代码审查也是保持良好应用状态的关键。

    Android检测Cursor泄漏的原理以及使用方法

    在Android开发中,Cursor对象是用于访问数据库查询结果的关键组件。然而,如果不正确地管理和关闭Cursor,就可能导致Cursor泄漏,从而占用大量内存并影响应用程序性能。以下是对Android检测Cursor泄漏的原理、使用...

    Android中CursorAdapter的使用

    在Android开发中,CursorAdapter是连接数据库查询结果(Cursor对象)与ListView、GridView等视图组件的重要桥梁。它主要用于展示SQLite数据库中的数据。本篇文章将深入探讨如何在Android应用程序中有效地使用...

    Cursor的用法.docx

    在Android开发中,`Cursor` 是一个非常重要的概念,它用于从SQLite数据库中检索数据。`Cursor` 类就像一个指针,可以遍历查询结果中的每一行数据。本篇文章将详细介绍如何使用`Cursor`以及在实际代码中的应用。 ...

    Android处理内存泄漏的代码例子

    在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...

    Android-Android使用jxl快速导出excel表

    你可以通过研究这个项目的源代码,学习如何将Android中的数据结构(如ArrayList或Cursor)与jxl库结合,实现数据的导出功能。 总之,使用jxl库在Android上快速导出Excel表格需要理解jxl的API,处理Android特有的...

    JoneCool-Android-MyDiary-master_android_androidstudio_Androidstu

    数据持久化是应用程序中的重要概念,指的是将数据保存到非易失性存储中,以便在应用程序关闭或设备重启后仍能保留数据。在MyDiary项目中,数据持久化主要通过SQLite数据库实现。SQLite是Android内置的轻量级关系型...

    cursor的部分操作

    在Android开发过程中,`Cursor`是一个非常重要的类,主要用于与数据库交互,实现数据的检索、更新等操作。通过`Cursor`,开发者可以轻松地进行数据查询,并且能够方便地遍历结果集中的每一行数据。本文将详细介绍`...

    android 加载本地联系人实现方法

    在Android应用开发中,访问和显示本地联系人是常见的需求,比如在社交应用或者通讯录类应用中。本文将详细讲解如何实现加载本地联系人到应用程序,并展示一个基本的UI设计示例。 首先,我们需要创建一个布局文件来...

    android读取系统联系人

    - 总是记得在不再使用Cursor时关闭它,以释放系统资源。 - 如果可能,使用异步任务或Loader来处理查询操作,避免阻塞主线程。 - 尽可能减少对系统资源的访问,避免频繁查询。 以上就是Android平台读取系统联系人...

    Android中使用SQLite示例

    在Android应用开发中,SQLite是一个重要的组成部分,它是一个轻量级的数据库系统,可以在设备上本地存储数据。SQLite被广泛用于需要持久化数据的应用中,比如用户设置、游戏进度、应用配置等。以下是对Android中使用...

    android取到通讯录中昵称的方法

    需要注意的是,为了保证资源的合理使用,查询结束后应当关闭Cursor对象,释放资源。 除此之外,我们还应该注意用户权限的问题。因为访问用户通讯录属于敏感权限,所以应用必须获得用户的明确授权后才能执行查询。这...

    android数据库操作实例

    在Android应用中使用数据库时,记得要在适当的地方关闭数据库连接,以避免资源泄漏。通常在操作完成后立即关闭`SQLiteDatabase`实例,例如在每个方法的末尾添加`db.close()`。 此外,Android Studio提供了SQLite...

    Android开发之系统信息【5】——获取APN列表

    Android 系统中对于 APN 的网络 API 没有公开,但是我们可以通过阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭 APN。 APN(Access Point Name)是移动网络上的一个概念,指的...

    android studio1.2 sqlite的操作

    在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的数据库系统,适用于移动设备。在Android Studio 1.2版本中,SQLite的操作对于开发者来说是构建应用程序的基础,特别是那些需要存储用户数据或者...

    Android App调试内存泄露之Cursor篇

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

Global site tag (gtag.js) - Google Analytics