getContentResolver查询导致CursorWrapperInner警告

时间:2012-08-22 02:28:38

标签: android cursor warnings

在4.0.3上,下面的代码导致警告“W / CursorWrapperInner(11252):光标已完成而没有事先关闭()”。

    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
    getContentResolver().query(uri, null, null, null, null);

在悲伤中,我发现了它来自哪里的警告,有人告诉我如何避免,因为我怀疑它与一些奇怪的问题有关吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

我也经历过这个奇怪的问题。我正在使用ContentProvider为我提供Cursor和CursorLoader来处理片段/活动中的提取。所以,我正在为书中所做的一切。

我使用4.1.1设备遇到了此警告消息,但它似乎已经消失在我的Nexus 7上,即4.2。就个人而言,我不会认真注意到这个警告。

更新: 我用Android v2.2测试我的代码,我从这个错误中得到了一个完整的堆栈跟踪。事实证明我的代码是获取另一个Cursor(不是使用Loader获取的那个),而这就是违规代码。手动关闭它可以解决问题。

答案 1 :(得分:1)

这行代码返回一个Cursor对象:

getContentResolver().query(uri, null, null, null, null);

您执行查询但忽略结果很奇怪。执行查询的唯一目的是将结果放在Cursor中。你应该将它存储到一个变量中:

Cursor cursor = getContentResolver().query(uri, null, null, null, null);

然后你可以使用光标来获取你需要的任何数据,完成后调用:

cursor.close();

您可以在Activity#onDestroy()或更早的时间关闭光标,但必须在活动完成之前关闭它,否则您将看到此警告。这是因为Cursor在另一个进程中由内存支持,并且您不希望泄漏该内存。