3

LoaderManagerを使用して、電話から連絡先のリストのカーソルをロードしています。

私は文字通りここに与えられたサンプルコードだけを使用しています:

http://developer.android.com/reference/android/app/LoaderManager.html

私の唯一の変更点は、これをメイン画面のリストビューのアダプターとして使用する代わりに、AutoCompleteTextViewのアダプターとして使用したことです。私の問題は、猛烈に入力するか、削除ボタンを押したままにして行のすべてを削除することによって、テキストをすばやく変更すると、次のエラーが発生することです。

01-09 02:36:47.248: E/AndroidRuntime(24231): FATAL EXCEPTION: main
01-09 02:36:47.248: E/AndroidRuntime(24231): android.database.StaleDataException: Attempted to access a cursor after it has been closed.
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.database.BulkCursorToCursorAdaptor.getColumnNames(BulkCursorToCursorAdaptor.java:159)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.database.AbstractCursor.getColumnIndex(AbstractCursor.java:283)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:308)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.widget.CursorAdapter.swapCursor(CursorAdapter.java:338)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.widget.CursorAdapter.changeCursor(CursorAdapter.java:309)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.widget.CursorFilter.publishResults(CursorFilter.java:67)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.os.Looper.loop(Looper.java:137)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at android.app.ActivityThread.main(ActivityThread.java:5070)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at java.lang.reflect.Method.invokeNative(Native Method)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at java.lang.reflect.Method.invoke(Method.java:511)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
01-09 02:36:47.248: E/AndroidRuntime(24231):    at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

3

CursorAdapterにはgetFilter()の基本実装があるようです。これは、runQueryOnBackgroundThread()を実行した後に現在のカーソルを返します。ListViewsはフィルターをまったく使用しないため、これはLoaderManagerの元のAndroid開発者の例では正常に機能します。ただし、AutoCompleteTextViewsはフィルターを使用するため、基本的に、カーソルをロードしようとしている2つの非同期スレッドを実行しており、スレッドセーフではありませんでした。

Filterは、LoaderManagerと同じ非同期読み込み機能をすでに提供しているため、LoaderManagerを廃止し、CursorAdapter.runQueryOnBackgroundThread()をオーバーライドしてFilterを介して読み込みます。

于 2013-01-10T01:40:27.217 に答える