Android使用後臺線程提高用戶體驗

<整理自網絡>
     當應用程序啓動時,系統會爲應用程序創建一個主線程(main)或者叫UI線程,它負責分發事件到不同的組件,包括繪畫事件。完成你的應用程序與android UI組件交互。例如,當您觸摸屏幕上的一個按鈕時,UI線程會把觸摸事件分發到組件上,更改狀態並加入事件隊列,UI線程會分發請求和通知到各個組件,完成相應的動作。

     單線程模型的性能是非常差的,除非你的應用程序相當的簡單,特別是當所有的操作都在主線程中執行,比如訪問網絡或數據庫之類的耗時操作將會導致用戶界面鎖定,所有的事件將不能分發,應用程序就像死了一樣,更嚴重的是當超過5秒時,系統就會彈出“應用程序無響應”的對話框。顯然這會造成很差的用戶體驗,所以我們需要保證主線程(UI線程)不被鎖住,如果有耗時的操作,我們需要把它放到一個單獨的後臺線程中執行。

      通過後臺線程來提高用戶體驗的方式很多,一個最簡單的方式就是在進行耗時操作的地方新開一個線程,用該線程來處理耗時操作,示例代碼如下:

      起初,上面的代碼似乎是一個很好的解決方案,因爲它不會鎖住用戶界面線程。然面不幸的是,它違反了用戶界面單線程模型:android的用戶界面工具包不是線程安全的,只能在UI線程中操作它。android提供了幾種方法來從其他線程訪問UI線程。下面是一個較全面的列表:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)
  • Handler

      一般情況下,我們會用Handler做UI線程的修改,示例代碼如下:

首先顯示一個ProgressDialog做界面友好提示,然後新開線程做耗時操作,最後調用handler的sendMessage,喚醒Handler。

 

      除了上述的幾種方法之外,1.5和更高版本的Android平臺提供了一個實用類稱爲AsyncTask,簡化了長時間運行的任務,需要與用戶界面的交互。AsyncTask的目標是要爲你的線程提供管理服務,示例代碼如下:

 

以下是AsyncTask的簡要使用方法:
    •您可以指定三個參數類型,泛型參數,進度值(執行過程中返回的值)和最終值(執行完返回的值)。
    •該方法doInBackground()自動執行工作線程(後臺線程)
    •onPreExecute(),onPostExecute()和onProgressUpdate()都是在UI線程調用
    •由doInBackground返回的值()發送到onPostExecute()
    •您可以在執行doInBackground()時調用publishProgress()然後在UI組程中執行onProgressUpdate()。
    •您可以從任何線程隨時取消任務

不管你是否使用AsyncTask,時刻牢記單一線程模型的兩條規則:
    1、不要鎖住用戶界面。
    2、確保只在UI線程中訪問android用戶界面工具包中的組件。

 

THE END!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章