Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 与LoaderManager的竞争条件?_Android_Android Loadermanager_Android Cursorloader - Fatal编程技术网

Android 与LoaderManager的竞争条件?

Android 与LoaderManager的竞争条件?,android,android-loadermanager,android-cursorloader,Android,Android Loadermanager,Android Cursorloader,我正在使用LoaderManager从手机中加载联系人列表的光标 我只是在使用这里给出的示例代码: 我唯一的改变是,我没有将其用作主屏幕listview的适配器,而是将其用作AutoCompleteTextView的适配器。我的问题是,当我快速更改文本时,无论是快速键入,还是按住delete按钮删除一行中的所有内容,都会导致以下错误: 01-09 02:36:47.248: E/AndroidRuntime(24231): FATAL EXCEPTION: main 01-09 02:36:4

我正在使用LoaderManager从手机中加载联系人列表的光标

我只是在使用这里给出的示例代码:

我唯一的改变是,我没有将其用作主屏幕listview的适配器,而是将其用作AutoCompleteTextView的适配器。我的问题是,当我快速更改文本时,无论是快速键入,还是按住delete按钮删除一行中的所有内容,都会导致以下错误:

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)

CursorAdapter似乎有一个getFilter()的基本实现,它在经过runQueryOnBackgroundThread()之后返回当前游标。这对于LoaderManager的原始Android开发人员示例很好,因为ListView根本不使用过滤器。但是,AutoCompleteTextView确实使用了过滤器,因此我实际上运行了两个异步线程,它们试图加载游标,这不是线程安全的


由于Filter已经提供了与LoaderManager相同的异步加载功能,我只是通过重写CursorAdapter.runQueryOnBackgroundThread(),取消了LoaderManager并通过筛选器加载。对于任何未来的寻求答案者,LoaderManager在当今时代都是可笑的过时,因此,应该不惜一切代价避免这种情况。