1. 程式人生 > >Android使用後臺執行緒提高使用者體驗

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!