天天看點

Android異步操作總結

Android中常常會有一些操作比方網絡請求,檔案讀寫。資料庫操作。比較耗時,我們須要将其放在非UI線程去處理。此時。我們須要處理任務前後UI的變化和互動。我們須要通過類似js中異步請求處理,這裡總結我所了解到的,友善自己記憶。也友善别人的浏覽。

  1. AsyncTask
new AysncTask().execute();

AsyncTask會依照流程運作在UI線程和一個耗時的任務線程。

(1) onPreExecute() 執行預處理,它執行于UI線程,能夠為背景任務做一些準備工作,比方繪制一個進度條控件。

(2) doInBackground(Params...) 背景程序運作的詳細計算在這裡實作,doInBackground(Params...)是AsyncTask的關鍵。此方法必須重載。在這種方法内能夠使用publishProgress(Progress...)改變目前的進度值。

(3)onProgressUpdate(Progress...) 執行于UI線程。假設在doInBackground(Params...) 中使用了publishProgress(Progress...)。就會觸發這種方法。

在這裡能夠對進度條控件依據進度值做出詳細的響應。

(4)onPostExecute(Result) 執行于UI線程,能夠對背景任務的結果做出處理,結果就是doInBackground(Params...)的傳回值。此方法也要常常重載,假設Result為null表明背景任務沒有完畢(被取消或者出現異常)。

2. Handler

       建立Handler時須要傳Lopper,預設是UI線程的。

      通過Handler發送消息(Message)到主線程或者Handler的線程,

3. Activity.runOnUiThread(Runnable)

     Runnable就可以在UI線程運作

4. View.post(Runnable)

Runnable執行在UI線程

View.post(Runnable)方法。在post(Runnable action)方法裡,View獲得目前線程(即UI線程)的Handler。然後将action對象post到Handler裡。在Handler裡,它将傳遞過來的action對象包裝成一個Message(Message的callback為action),然後将其投入UI線程的消息循環中。

在Handler再次處理該Message時,有一條分支(未解釋的那條)就是為它所設。直接調用runnable的run方法。而此時,已經路由到UI線程裡,是以。我們能夠毫無顧慮的來更新UI。

全部的異步操作原理本質都是通過Handler

基本上就這幾種方式。當然也可自己使用消息循環常見類似的任務處理機制。