【问题标题】:Android StrictMode reporting false positivesAndroid StrictMode 报告误报
【发布时间】:2011-05-26 15:34:38
【问题描述】:

我一直在尝试在 StrictMode 下运行我的应用程序,以检查是否存在任何可能偷偷摸摸的隐藏问题。我遇到的一个问题是,在使用 ContentResolver 时,Leaked DatabaseConnections 似乎是误报。

经过一些实验,问题简化为以下两行代码:

Cursor c = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, cols, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);

c.close()

上面的 2 行会产生以下 StrictMode 违规:

ERROR/StrictMode(26219): Releasing cursor in a finalizer. Please ensure that you explicitly call close() on your cursor: 

ERROR/StrictMode(26219): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

ERROR/StrictMode(26219):
        at android.database.CursorWindow.<init>(CursorWindow.java:62)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:403)
        at android.content.ContentResolver.query(ContentResolver.java:302)

我假设这是特定于 Cursor 由 contentProvider 返回的事实(因此它不是直接的 SQLite 光标)。

如果这确实是误报或确实存在泄漏的光标,是否有人知道。

【问题讨论】:

  • 我在使用 Honeycomb 发布的 CursorLoader API 时看到了类似的东西。我有一个 CursorLoader(它在后台线程中执行查询)和一个 SimpleCursorAdapter。原则上,当我从 CursorLoader 换入新游标时,SimpleCursorAdapter 应该关闭任何现有游标。但是,我也不断看到这些游标终结器 StrictMode 违规,所以这有点令人困惑。

标签: android android-strictmode


【解决方案1】:

我想我可以解释问题出在哪里。 当您查询数据库时,您可能会收到异常。因此,将创建一个游标 c.close() 将不会被调用,因为存在异常。因此,您必须将光标的创建放在 try catch 块中,并在 finally 块中关闭光标。

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多