Context.managedQuery()和context.getContentResolver()获取Cursor关闭注意事项

  在获取图片缩略图时,获取游标并进行相关的操作。

Cursor cursor = context.getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                THUMBNAIL_STORE_IMAGE,
                MediaStore.Images.Thumbnails.IMAGE_ID + " = ?",
                new String[]{id + ""},
                null);

  出现如下异常:

07-06 09:40:14.945 26649-26671/com.xxx.xxx E/ContentResolver: Cursor leak detected, query params: uri=content://media/external/images/thumbnails, projection=[Ljava.lang.String;@4214bca8, selection=image_id = ?, selectionArgs=[Ljava.lang.String;@421d05f8, sortOrder=null
07-06 09:40:14.945 26649-26671/com.xxx.xxx E/AndroidRuntime: FATAL EXCEPTION: Thread-1075
                                                                java.lang.IllegalStateException: Process 26649 exceeded cursor quota 100, will kill it
                                                                    at android.os.Parcel.readException(Parcel.java:1433)
                                                                    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
                                                                    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
                                                                    at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)
                                                                    at android.content.ContentResolver.query(ContentResolver.java:411)
                                                                    at android.content.ContentResolver.query(ContentResolver.java:354)
                                                                    at com.xxx.xxx.utils.localalbum.common.LocalImageHelper.getThumbnail(LocalImageHelper.java:179)
                                                                    at com.xxx.xxx.utils.localalbum.common.LocalImageHelper.initImage(LocalImageHelper.java:139)
                                                                    at com.xxx.xxx.utils.localalbum.common.LocalImageHelper$1.run(LocalImageHelper.java:92)
                                                                    at java.lang.Thread.run(Thread.java:856)

  这是由于游标没有关闭导致的问题。在finnally里面对cursor进行关闭即可。

Cursor cursor = context.getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                THUMBNAIL_STORE_IMAGE,
                MediaStore.Images.Thumbnails.IMAGE_ID + " = ?",
                new String[]{id + ""},
                null);
        try{
            ...
        }finally {
            if(null != cursor){
                cursor.close();
            }
        }

  然而,如果使用Context.managedQuery(),如果在android4.0以上,如果使用了Cursor.close()方法;则会报如下异常:

E/AndroidRuntime(31184): Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.

  在android 4.0及其以上的版本中,Cursor会自动关闭,不需要用户自己关闭。

  解决办法:

if(VERSION.SDK_INT < 14) {
    cursor.close();
}

 

时间: 2024-10-02 06:26:59

Context.managedQuery()和context.getContentResolver()获取Cursor关闭注意事项的相关文章

Android 缓存目录 Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

一.基础知识 应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的.大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中.这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据.如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢? 通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数

分享JavaScript获取网页关闭与取消关闭的事件

 这篇文章主要介绍了JavaScript获取网页关闭与取消关闭的事件,有需要的朋友可以参考一下 在做Web开发时,我们经常用到页面关闭事件onbeforeunload,可以给用户一个选择放弃关闭的机会,就比如这个博客编辑器.如果用户选择了离开,那么onunload事件自然会触发:但若用户选择了取消,又该如何检测呢?   我们假定一个页面离开取消事件,叫做onunloadcancel.显然,这个事件应触发在用户按下对话框的取消按钮之后.但关闭提示对话框的触发流程并不是那么简单.我们先来回顾下这个过

hibernate的session获取和关闭的问题

问题描述 hibernate的session获取和关闭的问题 我刚才看到有人说在实际的项目中是在业务层获取Session然后把此session传给dao层,将数据持久化或其他的操作.但是我看的很多代码上都是在dao层获取session的..事实是怎样的?? 其实我觉得业务层获取session很容易理解...但是我手头的三本jee的书都是在dao层获取session.... 解决方案 hibernate关于session的关闭问题获取hibernate的Session解决Hibernate的Ses

imple ursor dapter-关于重写SimpleCursorAdapter里面的游标cursor关闭问题

问题描述 关于重写SimpleCursorAdapter里面的游标cursor关闭问题 我在继承重写SimpleCursorAdapter类的bindView函数里面,提示我的游标cursor已经关闭,事实上,我在使用这个重写类的时候没有对cursor进行过close操作,贴上错误提示: 代码出错在46行处, 求帮,我找了一天答案了 解决方案 看一下数据查询完是不是把cursor给关闭了或者其他地方把这个cursor给关闭了. 解决方案二: 在Android3.0之后Cursor的生命周期已经和

context.Response.WriteFile(context.Request.PhysicalPath) 数据无法覆盖的问题

问题描述 用context.Response.WriteFile(context.Request.PhysicalPath)写入数据,然后用WebClient.DownloadFile(url,stringname)将其下载.接着再写入另外一个文件,此时再下载,虽然文件名可以按照命令变为第二次定义的文件名,可是内容却还是第一次写入的内容,context.Response.WriteFile(context.Request.PhysicalPath)无法覆盖么 解决方案 解决方案二:你在写完第一个

context.Response.WriteFile(context.Request.PhysicalPath)

问题描述 aspnet在一般处理程序中,可以使用context.Response.WriteFile输出页面,如果页面上含有用户控件!则通过context.Response.WriteFile(context.Request.PhysicalPath)无法将页面完成输出,即页面用户控件无法输出!求解决方法! 解决方案 解决方案二:莫非没有人遇到过这样的问题?解决方案三:System.IO.File.ReadAllText(path);解决方案四:引用2楼的回复: System.IO.File.R

Linux Context , Interrupts 和 Context Switching 说明【转】

转自:http://blog.csdn.net/tianlesoftware/article/details/6461207 一. 进程Context 定义        当一个进程在执行时, CPU的所有寄存器中的值.进程的状态以及堆栈中的内容,比如各个变量和数据,包括所有的寄存器变量.进程打开的文件.内存信息等.这些信息被称为该进程的上下文(Context).          一个进程的Context可以分为三个部分:用户级上下文.寄存器上下文以及系统级上下文:        (1)用户级

分享JavaScript获取网页关闭与取消关闭的事件_javascript技巧

在做Web开发时,我们经常用到页面关闭事件onbeforeunload,可以给用户一个选择放弃关闭的机会,就比如这个博客编辑器.如果用户选择了离开,那么onunload事件自然会触发:但若用户选择了取消,又该如何检测呢? 我们假定一个页面离开取消事件,叫做onunloadcancel.显然,这个事件应触发在用户按下对话框的取消按钮之后.但关闭提示对话框的触发流程并不是那么简单.我们先来回顾下这个过程: 复制代码 代码如下: window.onbeforeunload = function(){ 

Android编程获取全局Context的方法_Android

本文实例讲述了Android编程获取全局Context的方法.分享给大家供大家参考,具体如下: 有时,在处理业务逻辑的时候,需要Context对象,但在某些情况下,并非容易获取,这时就需要一些巧妙的手段来管理Context. 在Android中,提供了一个类Application,当应用程序启动的时候,系统会自动将这个类进行初始化,所以我们可以编写自己的Application类以管理一些全局的状态信息. 在这里,以获取全局Context为例. 1.编写自己的Application类 packag