【发布时间】:2014-08-16 07:04:42
【问题描述】:
我在我的 android 应用程序中遇到了 ANR,但我找不到问题所在。使用严格模式我得到这个异常:
StrictMode policy violation; ~duration=2 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1107)
at android.database.sqlite.SQLiteConnection.applyBlockGuardPolicy(SQLiteConnection.java:1034)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:835)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
at android.database.CursorWrapper.getCount(CursorWrapper.java:57)
at android.support.v4.widget.CursorAdapter.getCount(CursorAdapter.java:202)
at com.nhaarman.listviewanimations.BaseAdapterDecorator.getCount(BaseAdapterDecorator.java:69)
at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:801)
at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5958)
at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
at android.support.v4.widget.CursorAdapter$MyDataSetObserver.onChanged(CursorAdapter.java:473)
at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
at android.database.AbstractCursor.requery(AbstractCursor.java:137)
at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:225)
at android.database.CursorWrapper.requery(CursorWrapper.java:186)
at android.support.v4.widget.CursorAdapter.onContentChanged(CursorAdapter.java:449)
at android.support.v4.widget.CursorAdapter$ChangeObserver.onChange(CursorAdapter.java:465)
at android.database.ContentObserver.onChange(ContentObserver.java:129)
at android.database.ContentObserver$NotificationRunnable.run(ContentObserver.java:180)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
应用程序执行以下操作:
- 启动 Intent 服务并获取一些提要。
- 通过内容提供程序将提要保存到数据库。
- 片段有一个加载器,当写入发生时会收到通知
- 加载器读取新数据,将其传递给游标适配器并显示。
但是,当读取发生时,有时我会得到一个 ANR,根据我从堆栈跟踪中了解到的情况,游标重新查询数据库,如果花费的时间太长,我会得到一个 ANR,但是我虽然 Loaders 执行了异步操作。我不知道如何解决这个问题。
我初始化适配器时将“自动查询”标志设置为 false,这很重要。
使用安卓4.4
【问题讨论】:
标签: android android-contentprovider loader