我们在我们的应用中使用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
我们正在调查这可能与活动泄露有关的可能性,除此之外,这是我们得到的所有信息。
有什么想法吗?
发布于 2016-05-08 04:19:20
我仍然在寻找这个错误,因为我不能自己重现它,但我相信我找到了原因(至少对于我的情况,但我必须释放它,看看它是否有帮助)。
事实证明,在我的加载器上创建观察者时,我将处理程序作为null传递,期望获得与使用handler的默认构造函数时类似的beheavior (为了让它在主线程上运行,我从主线程创建它)。但是,它会立即从任何线程调用onChange。至少在我的例子中,onChange调用加载器的onContentChanged,它被记录为需要从主线程调用……事实并非如此,任务和cancellationTask搞砸了(因为没有更好的技术术语),这导致在任务的意外状态下触发取消,因此出现错误消息。
这也体现在我的例子中,因为加载器没有正确地更新条目,cancellationTask已经加载了一个值,所以加载器丢弃了新的任务,所以跳过了新的加载(takeContentChanged为false)。
因此,请确保从主线程使用new Handler()初始化观察器(onStartLoading应该是一个很好的地方)。
发布于 2015-10-15 01:04:05
可能在你的activity中,或者包装器类中引用了异步任务。如果您可以在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();}
https://stackoverflow.com/questions/33124568
复制相似问题