【问题标题】:Android Loader Application Not RespondingAndroid Loader 应用程序无响应
【发布时间】: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)

应用程序执行以下操作:

  1. 启动 Intent 服务并获取一些提要。
  2. 通过内容提供程序将提要保存到数据库。
  3. 片段有一个加载器,当写入发生时会收到通知
  4. 加载器读取新数据,将其传递给游标适配器并显示。

但是,当读取发生时,有时我会得到一个 ANR,根据我从堆栈跟踪中了解到的情况,游标重新查询数据库,如果花费的时间太长,我会得到一个 ANR,但是我虽然 Loaders 执行了异步操作。我不知道如何解决这个问题。

我初始化适配器时将“自动查询”标志设置为 false,这很重要。

使用安卓4.4

【问题讨论】:

    标签: android android-contentprovider loader


    【解决方案1】:

    您需要在后台线程上执行数据库事务。您在主线程上执行此操作,因此出现严格模式错误。您可以使用 AsyncTask 并在 doInBackground() 方法中执行事务。

    【讨论】:

    • 不确定我是否理解你,游标加载器不是异步执行查询吗?
    • 是的。您是否还有其他可能无法在后台线程上运行的事务?
    • 很确定我没有任何其他交易,也许我需要用其他工具调试它以查看发生了什么。
    【解决方案2】:

    如果您使用游标适配器,请确保您没有在构造函数中将 autoRequery 标志传递给它。如果你传递true,Cursor.requery() 将被适配器调用,这是错误的,因为这个调用将在UI 线程中触发。同样在并行线程中,CursorLoader 将选择数据。因此,如果您要从 CursorAdapter 中删除 autoRequery 标志,问题就会消失。我不知道为什么这个构造函数没有被弃用,但我们有我们所拥有的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-09
      • 2015-12-10
      • 2014-01-31
      • 1970-01-01
      相关资源
      最近更新 更多