ModernAsyncTask IllegalStateException

时间:2015-10-14 11:53:22

标签: android

我们在应用中使用AsyncTaskLoaders来加载内容。我们正在崩溃

java.lang.IllegalStateException: Cannot execute task: the task is already running.
   at android.support.v4.content.ModernAsyncTask.doInBackground(ModernAsyncTask.java:414)
   at android.support.v4.content.AsyncTaskLoader.executePendingTask(AsyncTaskLoader.java:219)
   at android.support.v4.content.AsyncTaskLoader.dispatchOnCancelled(AsyncTaskLoader.java:232)
   at android.support.v4.content.AsyncTaskLoader$LoadTask.onCancelled(AsyncTaskLoader.java:88)
   at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:464)
   at android.support.v4.content.ModernAsyncTask.access$400(ModernAsyncTask.java:48)
   at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:483)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:211)
   at android.app.ActivityThread.main(ActivityThread.java:5335)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

我们试图重现这一点,但还没有成功!

有没有办法找出造成这种情况的Loader?

我们正在使用 com.android.support:support-v4:23.0.1

我们正在研究这可能与活动泄漏有关的可能性,除此之外,这是我们获得的所有信息。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我仍在寻找这个错误,因为我无法自己复制,但我相信我找到了原因(至少在我的情况下,但我必须释放并看看它是否有帮助。)< / p>

事实证明,当我在我的加载器上创建观察者时,我将处理程序作为null传递,如果我使用Handler的默认构造函数(因为它在主线程上运行,我正在创建的线程),我希望得到类似的好处来自)。 然而,发生的事情是它从任何线程中调用onChange .. onChange至少在我的情况下调用加载器的onContentChanged,记录需要从主线程中调用...作为&#39;不是这样,任务和取消任务搞砸了(因为没有更好的技术术语)导致取消在任务的意外状态下被触发,因此出现错误消息。

这也表明在我的情况下,由于加载器没有正确更新条目,cancelTask​​已经加载了一个值,因此加载器丢弃了新任务,因此跳过了新的加载(takeContentChanged为false)。

因此,请确保使用主线程中的新Handler()初始化您的观察者(onStartLoading应该是一个很好的位置)。

答案 1 :(得分:0)

您可以在活动或包装类中引用异步任务。如果您在onClick中执行了此任务。您可以在View上点按两次,然后出现此错误。

<强>更新

如果您想检查活动是否泄露,可以使用泄漏金丝雀。这是非常有用的工具。

Leak canary

您可以使用StrictMode查找有关泄漏的信息。

 public void onCreate() {
 if (DEVELOPER_MODE) {
     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
             .detectDiskReads()
             .detectDiskWrites()
             .detectNetwork()   // or .detectAll() for all detectable problems
             .penaltyLog()
             .build());
     StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
             .detectLeakedSqlLiteObjects()
             .detectLeakedClosableObjects()
             .penaltyLog()
             .penaltyDeath()
             .build());
 }
 super.onCreate();

}