2015-10-14 93 views
4

我们在我们的应用程序中使用AsyncTaskLoaders来加载内容。我们遇到这个故障ModernAsyncTask IllegalStateException

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

我们正在调查,这可能有一个链接到活动泄漏,比其他的可能性,这是所有的信息我们越来越。

任何想法?

+0

您是否使用过yourtask.cancel事件? –

+0

我们不打电话取消明确 –

回答

0

显然你有你的活动或包装类引用异步任务。如果您在onClick中执行了此任务。你可以点击两次查看,你会得到这个错误。

更新

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

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(); 

}

+0

不,你错了。在这种情况下,您将获得:http://pastebin.com/mLs8Qu3e AsyncTask与加载程序正在使用的ModernAsyncTask无关。 –

2

我仍在追捕这个错误,因为我不能复制它自己,但我相信我找到了原因(至少对于我的情况,但我不得不释放,看看它有助于)。

原来,当我在我的加载器上创建观察器时,我将该处理器作为null传递,期待类似如果我使用Handler的默认构造函数(因为它在主线程上运行,从它创建)。 然而,它会立即调用onChange,从任何线程.. onChange至少在我的情况下调用加载器的onContentChanged,这是记录需要从主线程调用...因为情况并非如此,任务和cancellationTask搞砸了(因为没有更好的技术术语),导致取消在意外的任务状态中被触发,因此出现错误信息。

这也表现在我的情况,因为加载程序没有正确更新条目,cancellationTask已经加载了一个值,因此加载程序放弃了新任务,因此新的加载被跳过(takeContentChanged为false)。

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

+0

你已经发布了吗?你能弄明白吗? – Macarse

+0

我确实发布了,它帮助例外,至少我没有看到它,因为:) – sickmartian