2013-02-24 73 views
4

我試圖解決我的應用程序中有一個非常零星的故障。進入應用程序時,主UI線程處理結束,並將控制權交給後臺線程以檢索一些數據。當數據被檢索時,控制權返回到主UI線程以處理它以供顯示。然而,在一些罕見的場合(它有99%的時間工作),AsyncTask似乎無法被稱爲永遠等待AsyncTask完成而將應用程序置於靜態狀態。什麼會導致AsyncTask無法執行?

下面的代碼在Activity快照:

//method call from main UI thread 
private void fetchSomeData() { 
    Log.d("myTag", "In fecthSomeData()"); 
    new ReadFileAsyncTask<DataModel>().execute(this); 
} 

這裏的ReadFileAsyncTask實現:

public class ReadFileAsyncTask<A> extends AsyncTask<I_ReadFileListener<A>, Void, A> 
{ 
I_ReadFileListener<A> listener; 

@Override 
@SuppressWarnings("unchecked") 
protected A doInBackground(I_ReadFileListener<A>... params) 
{ 
    listener = params[0]; 
    Log.d("mytag", "BACKGROUND: Loading " + listener.getFilename() + " from disk"); 
    A fileContents = (A) FileUtils.readDataFromInternalStorage(listener.getContext(), listener.getFilename()); 
    return fileContents; 
} 

@Override 
protected void onPostExecute(A result) 
{ 
    Log.d("myTag", "FOREGROUND: Executing onFileRetrieved listener"); 
    listener.onFileRetrieved(result); 
} 
} 

捕捉這難得失敗yeilds日誌:

In fetchSomeData() 
... 
(Other log messages from other interactions with the activity such as menu creation and navigation initialization) 

但關鍵的是,不是來自第二行代碼的日誌聲明方法doInBackground。有一個想法是,這個日誌聲明失敗了,但我沒有看到任何強制停止消息,我的日誌或ACRA崩潰報告中的錯誤。應用程序仍然處於活動狀態(我可以導航到其他活動並返回),所以我不知道什麼可能會阻止此後臺線程正常運行。有任何想法嗎?

+0

你使用任何其他AsyncTasks,而這一個正在執行?或者這是唯一的AsyncTask? – 2013-02-24 22:17:24

+0

這是應用程序啓動的第一個AsyncTask。我有很多其他人,但他們在完成這個之後被調用。 – 2013-02-24 22:22:06

+0

這是什麼類型的Android設備?你有沒有嘗試過別人? – 2013-02-24 22:54:38

回答

1

很遺憾,AsyncTask不適合執行關鍵代碼,因爲根據ThreadPool基本和最大大小,您的AsyncTask可能永遠不會執行。

而且,當它所指的Activity(即其創建上下文)已被銷燬時,可調用onPostExecute方法。你無法與它同步,而不是使用UI線程的AsyncThread上的join()。

即使我已經看到了這個也做在Android相機應用是不阻止UI線程等待一個事件,因爲你coulg得到ANR(應用程序不運行)通知是一個好主意。

在此請看:Is AsyncTask really conceptually flawed or am I just missing something?

考慮使用IntentServicesHandlerThreadThreadPoolExecutors如果你需要一個可能是更好的方式來你的工作線程與您的UIThread同步。

http://developer.android.com/training/run-background-service/create-service.html

而且,IntentService不被大多數用戶界面生命週期事件的影響,所以它繼續在將關閉的情況下的AsyncTask運行

+0

事實證明,Honeycomb +上的核心線程池只是1個後臺線程(http://developer.android.com/reference/android/os/AsyncTask.html#execute(Params) ...))。我有另一項服務與我的應用程序一起運行,在特殊情況下,可以執行Aysnc任務很長時間,基本上佔用單個背景。看起來像是它重新設計線程支持服務Asyc任務的時間。另請參閱這個超級有用的問題和答案在這個問題上:http://stackoverflow.com/questions/9654148/android-asynctask-threads-limits – 2013-09-06 14:54:15

相關問題