2015-10-14 58 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