【问题标题】:What can cause StaleDataException other than prematurely calling cursor.close()?除了过早调用 cursor.close() 之外,还有什么会导致 StaleDataException?
【发布时间】:2013-02-05 15:44:04
【问题描述】:

我目前正在大量修改/重写一个 Android 应用程序,并且我看到了一个非常偶然的崩溃,大致如下:调用了 CursorAdapter 方法,它调用了 AbstractWindowedCursor#checkPosition(),并且:

02-20 15:03:18.180 E/AndroidRuntime(17143): android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method.
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.CursorWrapper.getLong(CursorWrapper.java:106)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.widget.CursorAdapter.getItemId(CursorAdapter.java:220)

问题是,我们没有关闭任何Cursors。我们所有的Cursors 都来自CursorLoaders,反过来又由ContentProvider 产生。我们将CursorLoaderCallbacks 传递到每个相应的CursorAdapter,我们在ContentProvider 中注册Cursor 以获取通知,我们正在通知@987654334 @ 来自每个insert(...)delete(...)update(...) ... 简而言之,我找不到任何理由说明Cursor 在使用时会关闭。

那么:StaleDataException其他原因是什么?

【问题讨论】:

  • 您已经有一段时间没有问过了,但是……有没有涉及到 FilterQueryProvider ?
  • 嘿安德鲁!你能想出解决办法吗?
  • 我认为我们从来没有明确地追踪到这一点。但是,我们确实发现使用适配器外部的Cursor 会引发这种行为,尽管(再次)我们从未调用过.close() 或您认为会导致这种情况的任何方法。从那时起,如果我不得不在适配器内部和外部使用光标,我总是以类似于android.googlesource.com/platform/frameworks/base/+/master/core/…(跳到最后)的方式实现ContentObserverDataSetObserver

标签: android android-contentprovider android-loadermanager android-loader staledataexception


【解决方案1】:

如果您正在调用 Cursor.changeCursor(newCursor),它将自动为您关闭旧光标。如果仍有任何东西试图访问游标,这可能会导致 android.database.StaleDataException。

【讨论】:

    【解决方案2】:

    如果您在android 4.0及以上版本中调用Context.managedQuery(),则不应调用Cursor.close(),否则会抛出StaleDataException,您可以修改代码如下:

    if(VERSION.SDK_INT < 14) {  
        cursor.close();  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2011-03-30
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2016-12-21
      相关资源
      最近更新 更多