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表明後台任務沒有完成(被取消或者出現異常)。
Handler 創建Handler時需要傳Lopper,默認是UI線程的。 通過Handler發送消息(Message)到主線程或者Handler的線程,
Activity.runOnUiThread(Runnable) Runnable即可在UI線程執行
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
基本上就這幾種放大,當然也可自己使用消息循環常見類似的任務處理機制。
Android異步下載圖片並且緩存圖片到本地 http://www.linuxidc.com/Linux/2014-04/100444.htm
Android異步任務(AsyncTask)的設計思想 http://www.linuxidc.com/Linux/2014-02/97104.htm
Android 異步加載圖片分析 http://www.linuxidc.com/Linux/2013-06/85369.htm
Android 中加載網絡資源時的優化 緩存和異步機制 http://www.linuxidc.com/Linux/2013-06/85364.htm
Android短彩信幻燈片異步加載機制 http://www.linuxidc.com/Linux/2013-03/81528.htm
Android-自定義TextView和異步加載圖片的實現 http://www.linuxidc.com/Linux/2012-12/76331.htm
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11