【问题标题】:getContentResolver query cause CursorWrapperInner warninggetContentResolver 查询导致 CursorWrapperInner 警告
【发布时间】:2022-01-05 21:38:00
【问题描述】:

在 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);

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

【问题讨论】:

    标签: android warnings android-cursor


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这行代码返回一个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-27
        • 2012-06-17
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-07
        • 2017-06-11
        • 2015-04-13
        相关资源
        最近更新 更多