我们在应用中使用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
我们正在研究这可能与活动泄漏有关的可能性,除此之外,这是我们获得的所有信息。
有什么想法吗?
答案 0 :(得分:2)
我仍在寻找这个错误,因为我无法自己复制,但我相信我找到了原因(至少在我的情况下,但我必须释放并看看它是否有帮助。)< / p>
事实证明,当我在我的加载器上创建观察者时,我将处理程序作为null传递,如果我使用Handler的默认构造函数(因为它在主线程上运行,我正在创建的线程),我希望得到类似的好处来自)。 然而,发生的事情是它从任何线程中调用onChange .. onChange至少在我的情况下调用加载器的onContentChanged,记录需要从主线程中调用...作为&#39;不是这样,任务和取消任务搞砸了(因为没有更好的技术术语)导致取消在任务的意外状态下被触发,因此出现错误消息。
这也表明在我的情况下,由于加载器没有正确更新条目,cancelTask已经加载了一个值,因此加载器丢弃了新任务,因此跳过了新的加载(takeContentChanged为false)。
因此,请确保使用主线程中的新Handler()初始化您的观察者(onStartLoading应该是一个很好的位置)。
答案 1 :(得分:0)
您可以在活动或包装类中引用异步任务。如果您在onClick中执行了此任务。您可以在View上点按两次,然后出现此错误。
<强>更新强>
如果您想检查活动是否泄露,可以使用泄漏金丝雀。这是非常有用的工具。
您可以使用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();
}