文章来源:
http://www.eyeandroid.com/thread-691-1-1.html
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.
分享到:
相关推荐
当一个线程调用另一个线程的`join()`方法时,调用线程会暂停执行,直到被调用线程结束或超时(如果指定了超时时间)。 - **wait方法**:此方法用于释放当前线程持有的对象锁,并使线程进入等待状态。它通常与`...
2. **URI**:每个 Content Provider 需要定义一个唯一的公开 URI,用于标识其数据集。URI 通常以 `content://` 开头,后面跟着 Content Provider 的包名。自定义 Content Provider 应该将 URI 设为类的常量,方便...
首先,要进入图库,我们需要创建一个Intent来启动系统图库应用。通过设置Intent的类型为"image/*",表明我们要选择的是图像文件。然后,设置Action为Intent.ACTION_GET_CONTENT,这表示我们希望用户选择一个内容。...
以上代码首先定义了查询时所需的列名,然后构建了一个URI指向系统日历表,并使用`managedQuery()`方法执行查询。查询条件设置为只返回被选中的日历(`selected=1`),这样可以避免获取到用户未启用的日历。 #### 四...
在例子中,`managedQuery()`函数通过Content Provider查询数据库,返回一个Cursor对象,开发者可以使用Cursor遍历和处理数据。 4. **Cursor与Adapter**:Cursor是数据库查询结果的抽象,它提供了访问数据库行数据的...
为了从SD卡上读取所有音乐文件,我们需要构建一个查询,该查询可以返回所有符合音乐标准的文件。根据给定的代码示例,我们首先定义了查询时所需的列(`projection`)和筛选条件(`selection`)。 ```java String[] ...
在Content Provider中使用的查询字符串有别于标准的SQL查询 很多诸如select add delete modify等操作我们都使用一种特殊的URI来进行 这种URI由3个部分组成 “content: ” 代表数据的路径 和一个可选的标识数据的ID ...
以下是一个详细解释如何在Android 4.4之后获取相册图片和路径的实现方法。 首先,我们需要了解在不同版本的Android中,获取相册图片的Intent API的变化。在早期版本中,通常使用`Intent.ACTION_GET_CONTENT`,并...
在Android开发中,监听短信数据库的变化是一项常见的需求,尤其是在...同时,需要注意的是,在访问短信等敏感数据时,必须遵循Android的权限管理规则,申请并获得必要的权限,以确保应用的合规性和用户数据的安全性。
在深入探讨给定的代码片段...然而,在实际开发中,还需要注意权限管理,确保在合法合规的前提下使用这些功能,保护用户隐私。此外,考虑到不同设备和Android版本可能存在差异,开发时应充分测试,确保兼容性和稳定性。
需要提供Uri和一个包含新数据的ContentValues对象。 - 更新数据:使用ContentResolver.update()方法,指定要更新的Uri、新的ContentValues对象以及可选的筛选条件来更新已有数据。 - 删除数据:通过ContentResolver....
在Android开发中,读取内存卡(通常指SD卡)上的文件是一项常见需求,尤其是在处理多媒体数据如图片、音频或视频时。以下是对如何在Android中读取内存卡文件的详细解析,包括代码示例、原理说明以及注意事项。 ### ...
如果选择不使用`managedQuery`,而是自己控制`Cursor`的生命周期,那么在异步任务的`onPostExecute`方法中处理`Cursor`时,需要注意以下几点: 1. **不要立即关闭Cursor**:在`onPostExecute`中,`Cursor`会被用来...
- 数据共享:当一个应用需要将自己的数据资源提供给其他应用时,例如应用间的通讯录、日历或者自定义数据。 - 统一接口:ContentProvider提供了一种标准化的接口,让数据访问方式保持一致,无论数据存储在何处...
一个常见方法是使用`Intent.ACTION_GET_CONTENT`启动一个选择器,让用户从设备上的图库中选取图片。在代码示例中,首先创建一个`AlertDialog`,提供“相册”和“相机”两个选项。当用户选择“相册”时,通过`Intent`...
查询联系人数据时,可以使用`managedQuery()`方法,它接受五个参数:URI、投影(projection,即要查询的字段)、选择条件(selection)、选择条件参数(selectionArgs)和排序顺序(sortOrder)。例如,要按姓名筛选...
每个 Content Provider 都会对外提供一个公共的 URI,其他应用程序可以通过这个 URI 来对数据进行增删改查操作。 - **Content Resolver**:Content Resolver 是 Android 系统提供的用于与 Content Provider 进行通信...
当我们通过Intent从其他应用(如相机或图库)获取到一个Uri时,我们通常不能直接从Uri获取到文件的完整路径,因为Uri可能指向内存中的数据或者存储卡上的某个位置。 以下是一个典型的步骤来从Uri获取真实路径并转换...
每个ContentProvider都通过一个特定的`Uri`来标识其存储的数据。这些`Uri`通常遵循一定的模式,以便客户端可以通过解析`Uri`来确定具体的表名或数据路径。 #### 四、数据的查询方式 **手动管理Cursor:** ```java ...