6

在 4.0.3 上,以下代码会导致警告“W/CursorWrapperInner(11252): Cursor finalized without prior close()”。

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

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

在此处输入图像描述

4

2 回答 2

2

我也遇到过这个奇怪的问题。我正在使用 ContentProvider 为我提供 Cursor 和 CursorLoader 来处理我的 Fragment/Activity 中的获取。所以我正在“为书”做所有事情。

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

更新:我正在使用 Android v2.2 测试我的代码,我从这个错误中得到了完整的堆栈跟踪。事实证明,我的代码正在获取另一个游标(不是使用加载器获取的游标),这就是有问题的代码。手动关闭它就可以了。

于 2013-05-02T07:02:13.913 回答
1

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

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

您正在执行查询但忽略结果,这很奇怪。执行查询的唯一目的是在游标中获取结果。您应该将其存储到一个变量中,如下所示:

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

然后,您可以使用光标获取所需的任何数据,并在完成后调用:

cursor.close();

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

于 2012-12-19T02:10:45.880 回答