2012-07-02 50 views
0

我的下載文件AsyncTask在2g網絡上同時下載時可能需要相當長的時間。我懷疑它被殺死了,但我不確定。catch asynctask ANR

我的問題是:asynctask上的超時是什麼,當android殺死我的任務時會調用什麼函數?如果拋出異常,在哪裏捕捉它?

+0

我認爲沒有超時之類的東西。但是有'線程池'之類的東西,所以線程池中的線程可以被殺死。你應該閱讀這個[ThreadPoolExecutor](http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html) –

+0

費時的AsyncTask的真正問題是,如果Activity(其中AsyncTask已啓動)被破壞,你離開AsyncTask繼續運行,它將變得無法訪問,導致內存泄漏,並導致各種異常結果。 – yorkw

回答

0

Android不應該殺死你的任務。 AsyncTask就是這樣,Asynchronous,所以Android不會爲它拋出ANR。

如果要測試doInBackground中的異常,請將代碼包裝在相關代碼中,嘗試使用catch塊,然後在出現異常時拋出或處理異常。

你可以取消一個AsyncTask,但是你必須在你的任務中以相關時間間隔檢查isCancelled標誌。

一旦你取消了任務,onPostExecute()將不會被調用。

進一步閱讀,當然可在這裏:http://developer.android.com/reference/android/os/AsyncTask.html

此外: 注意了,也許是重要的Android Ice Cream Sandwich的,也許從蜂窩線程池執行移開默認和使用,而不是一個序列化的方法。如果您在ICS上發現您的任務看起來從未執行或在重大等待之後執行,則應該使用executeOnExecutor()執行,並將其傳遞給參數THREAD_POOL_EXECUTOR。更多信息可在上面的鏈接中找到。