2014-01-09 93 views
0

我的應用程序包含一個函數,需要花費時間來加載(解析文件)。 該功能是在多用戶情況下調用的,即來自多用戶觸發條件。 此外,它調用onCreate時調用。安卓異步任務的使用順序依賴任務

在簡單的一句話,流量:

  1. 用戶點擊/ OnCreate中觸發
  2. 功能解析文件
  3. 後到窗口
  4. 其他後期處理時

希望用戶可以點擊取消來停止解析文件。

我試着用asynctask。我知道我可以把函數放在onPostExecute上。 但我認爲onPostExecute只是用於解僱進度對話框。或者我必須將很多代碼(針對不同情況)移動到它。不是一個好主意。

我不假設用戶在解析文件時做任何事情。

那麼,最好的辦法是什麼?儘管我知道它不好,但我認爲我必須佔用UI線程。

簡而言之,我想等待「解析文件」,但我不想佔用UI線程,因此用戶可以單擊取消。

更新: 我試過了。但是,有一個問題: 我使用asynctask。我打電話給:

mTask = new YourAsyncTask().execute(); 
YourAsyncTask.get(); // this force to wait for YourAsyncTask to return. 
DoSomethingBaseOnAsyncTaskResult(); 

YourAsyncTask.get()持有UI線程。因此,沒有加載對話框,並且用戶無法從對話框中單擊取消。看來我以後

mTask = new YourAsyncTask().execute(); 

每行移動到

OnPostExecute() 

但我並不喜歡這樣做,因爲DoSomethingBaseOnAsyncTaskResult()可以根據返回的結果有很大的不同。否則,就成了YourAsyncTask()做的一切

回答

0

AsyncTasks應該理想地(最多幾秒鐘)。 當執行異步任務,任務經過4個步驟用於短操作:

onPreExecute(),在任務執行前在UI線程上調用。此步驟通常用於設置任務,例如通過在用戶界面中顯示進度條。

doInBackground(Params ...),在onPreExecute()完成執行後立即在後臺線程上調用。此步驟用於執行需要很長時間的後臺計算。此步驟還可以使用publishProgress(Progress ...)發佈一個或多個進度單元。這些值在onProgressUpdate(Progress ...)步驟中發佈在UI線程上。

onProgressUpdate(Progress ...),在調用publishProgress(Progress ...)後在UI線程上調用。執行的時間是未定義的。此方法用於在後臺計算仍在執行時在用戶界面中顯示任何形式的進度。例如,它可以用來爲進度條設置動畫效果或在文本字段中顯示日誌。

onPostExecute(Result),在後臺計算完成後在UI線程上調用。後臺計算的結果作爲參數傳遞給此步驟。

CODING

要啓動一個異步任務

mTask = new YourAsyncTask().execute(); 

,並取消該任務

mTask.cancel(true); 

更多詳細信息,請here

+0

請參閱我的問題的更新,感謝了很多! – manhon

+0

請詳細說明您的要求。 –

0

鄰要使用AsyncTask API,必須遵循下述步驟:

  1. 創建一個擴展AsyncTask的類。
  2. 填寫可在類仿製藥的泛型類型:

    • 任務執行數組參數

    • 進步陣列參數

    • 結果數組參數

  3. 執行m ethod doInBackground(參數...參數)。這種方法必須執行應該相當苛刻的工作。

  4. 可選,一個可以實現的方法:

    • 取消任務 - onCancelled(...)

    • 苛刻的任務之前執行的任務 - onPreExecute(...)

    • 報告進度 - onProgressUpdate(...)

    • 執行d後的活動要求任務完成 -onPostExecute(...)。