4

ハニカムを使用するように完全に変換されたこのアクティビティがあります。新しいcursorLoaderを使用するために、すべてのカーソル管理を作り直しました。他のすべての OS バージョン (互換性ライブラリを使用) ではすべてがうまく機能しますが、ハニカムではまだ機能しません。次のスタック トレースは、どのカーソルまたはどの行が失敗しているかがわからないため、理解するのが非常に困難です。さらに、デバッグ時には、ParentActivity のコード行は実行されません。ParentActivity を再開すると、このエラーが発生します。アクティビティを開始するとうまくいきますが、アクティビティに戻ると失敗します。

05-29 17:23:32.978: ERROR/AndroidRuntime(31692): FATAL EXCEPTION: main
05-29 17:23:32.978: ERROR/AndroidRuntime(31692): java.lang.RuntimeException: Unable to resume activity {com.xxx.xxx/com.xxx.xxx.ParentActivity}: java.lang.IllegalStateException: trying to requery an already closed cursor
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2227)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2255)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1028)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.os.Looper.loop(Looper.java:132)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread.main(ActivityThread.java:4025)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at java.lang.reflect.Method.invokeNative(Native Method)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at java.lang.reflect.Method.invoke(Method.java:491)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at dalvik.system.NativeStart.main(Native Method)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692): Caused by: java.lang.IllegalStateException: trying to requery an already closed cursor
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.Activity.performRestart(Activity.java:4394)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.Activity.performResume(Activity.java:4420)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2217)
05-29 17:23:32.978: ERROR/AndroidRuntime(31692):     ... 10 more
4

3 に答える 3

11

私は同じ問題に遭遇しました。これが私がやったことです。startManagingCursor と呼んだすべてのアクティビティで、次のようにオーバーライドします。

@Override
public void startManagingCursor(Cursor c) {

    // To solve the following error for honeycomb:
    // java.lang.RuntimeException: Unable to resume activity 
    // java.lang.IllegalStateException: trying to requery an already closed cursor
    if (Build.VERSION.SDK_INT < VersionUtil.HONEYCOMB) {
        super.startManagingCursor(c);
    }
}

これにより、私のアプリは Honeycomm とそれ以前のバージョンで正しく動作します。

于 2011-06-09T23:26:22.773 に答える
5

私は同じ問題を抱えていて、問題と「クリーンな」修正を見つけたかもしれないと思います。(カーソルの管理を停止することはお勧めできません)

ハニカムを除くすべてのバージョンでうまく機能するいくつかのアクティビティで Adapter.changeCursor を使用します。changeCursor メソッドは古いカーソルを閉じますが、明らかにそのカーソルの管理を停止しません。したがって、アクティビティは、既に閉じられている古いカーソルを管理し続けます。アクティビティの再起動では、アクティビティが閉じているかどうかを確認せずに、再クエリを試みます。

だから私の解決策は次のとおりです。

Cursor oldCursor = mAdapter.getCursor();
mAdapter.changeCursor(newCursor);
stopManagingCursor(oldCursor);

今まで、例外を再び再現することはできません。

于 2011-07-05T08:04:10.907 に答える
3

これは、カーソルの管理方法に対して Honeycomb で行われたいくつかの変更の影響です。以前は、startManagingCursor複数回呼び出すと、すべてが正常に機能し続けていましたが、現在はIllegalStateException、アクティビティが閉じたカーソルを再クエリしようとしているため、エラーが発生します。startManagingCursor解決策は、再度呼び出す前に古いカーソルを閉じることです(カーソルを交換する場合など)。

したがって、ParentActivity内のマネージ カーソル ライフサイクルの結果として、これを間接的に行っていますActivity

ACL と CursorLoader を使用していると言いましたが、カーソルを変更するときにswapCursor(Cursor c)を呼び出していることを確認してください。これで問題が解決するはずです。

これに関する議論の一部をここで見ることができます: http://groups.google.com/group/android-developers/browse_thread/thread/658133bec901d7e

于 2011-05-30T00:52:49.033 に答える