在4.0.3上,下面的代码导致警告“W / CursorWrapperInner(11252):光标已完成而没有事先关闭()”。
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
getContentResolver().query(uri, null, null, null, null);
在悲伤中,我发现了它来自哪里的警告,有人告诉我如何避免,因为我怀疑它与一些奇怪的问题有关吗?
答案 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在另一个进程中由内存支持,并且您不希望泄漏该内存。