1

私のメイン アクティビティ (たとえば A) は、ContactsContract から ContactID をフェッチする意図を発生させます。

startActivityForResult(new Intent(Intent.ACTION_PICK, contactsContract.Contacts.CONTENT_URI),PICK_CONTACT);

(onActivityResult(int reqCode, int resultCode, Intent data)) を返している間、「データ」の詳細を使用して連絡先を照会しています

 if (resultCode == Activity.RESULT_OK) {
        Uri contactData = data.getData();
        Cursor c =  managedQuery(contactData, null, null, null, null);
        ......

私のコードは Android 2.x で正常に動作します。ただし、メインのアクティビティ (A) を再開するときに、このコードは ICS (Android 4.x) でクラッシュします。非推奨の「managedQuery」が原因かどうかはわかりません。誰かが解決策を提供してくれますか? Log cat にはエラー行番号さえ表示されないため、エラーの原因となっている行を見つけることさえできません。それは単に言う 原因: android.database.StaleDataException: カーソルが閉じられた後にカーソルにアクセスしようとしました。 前もって感謝します

カーソルの要件を完了した直後に、上記のコードを試しました。それでも問題は解決しません。私のログ猫は次のように言います

08-13 00:26:31.427: W/dalvikvm(3176): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
08-13 00:26:31.447: E/AndroidRuntime(3176): FATAL EXCEPTION: main
08-13 00:26:31.447: E/AndroidRuntime(3176): java.lang.RuntimeException: Unable to resume activity {com.desquare.sp/com.desquare.sp.SmartPadActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2444)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1173)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.os.Looper.loop(Looper.java:137)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread.main(ActivityThread.java:4424)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at java.lang.reflect.Method.invoke(Method.java:511)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at dalvik.system.NativeStart.main(Native Method)
08-13 00:26:31.447: E/AndroidRuntime(3176): Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:75)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.database.BulkCursorToCursorAdaptor.requery(BulkCursorToCursorAdaptor.java:144)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.database.CursorWrapper.requery(CursorWrapper.java:186)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.Activity.performRestart(Activity.java:4505)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.Activity.performResume(Activity.java:4531)
08-13 00:26:31.447: E/AndroidRuntime(3176):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434)
08-13 00:26:31.447: E/AndroidRuntime(3176):     ... 10 more
4

2 に答える 2

6

これが問題のようです:

* android.database.staledataexception : 閉じたカーソルにアクセスする

managedQuery を使用してカーソルを取得しているようです。

アプリケーションの復元で問題が発生しましたが、Icecream Sandwich で何らかの理由でカーソルが適切に閉じられませんでした。修正は、それらを使用した直後にすべてのカーソルに対してこれを行うことでした:

if (cursor != null && !cursor.isClosed()) {  
  myActivity.stopManagingCursor( cursor );   
  cursor.close(); 
}
于 2012-08-11T19:39:20.027 に答える
0

API startManagingCursor/stopManagingCursor は非推奨であり、問​​題の根本原因です。たとえば、これをコメントアウトして確認してください。

于 2015-07-20T14:08:09.570 に答える