多線程與異步任務

在Android應用程序中,爲了避免ANR(Application Not Response)異常,需要把耗時任務放置在子線程中來完成。或者使用AsyncTask類來完成。

一、多線程和線程池:
 1. 實現方式:
    1) 繼承自Thread類,重寫它run()方法。通過它的start()來啓動線程。
    2) 定義一個實現Runnable接口的類(重寫它的run()方法),以這個對象來構造Thread對象。
 2. java.util.Timer類的應用。
 3. 線程池:使用ExecutorService類的實例來表示,使用Executors類提供的靜態方法來創建。
    1) Single Thread Executor: 只有一個線程的線程池,因此所有提交的任務是順序執行。
                       代碼:ExecutorService Executors.newSingleThreadExecutor();
    2) Cached Thread Pool: 線程池裏有很多線程需要同時執行,老的可用線程將被新的任務觸發重新執行。超過60秒內沒執行的線程將被終止並從池中刪除,代碼:Executors.newCachedThreadPool()
        ★3) Fixed Thread Pool: 擁有固定線程數的線程池,如果沒有任務執行,那麼線程會一直等待。
                      代碼:ExecutorService Executors.newFixedThreadPool(int nThreads)
    4) Scheduled Thread Pool: 用來調度即將執行的任務的線程池,代碼:Executors.newScheduledThreadPool()
    5) Single Thread Scheduled Pool: 只有一個線程,用來調度執行將來的任務,代碼:Executors.newSingleThreadScheduledExecutor()

    6) 自定義一個線程池:
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(6, 30, 30L, TimeUnit.SECONDS, new LinkedBlockingQueue());
        threadPool.execute(new Runnable() {…});
       
    7) 線程池不使用時,需要調用它的shutdown()方法進行關閉。

★★二、Handler機制:Android程序中,子線程中需要更改主線程(UI線程)中的UI組件的屬性值時,就需要使用Handler來處理。
  1. Android UI操作不是線程安全的,所以在Activity中新啓動的線程不能訪問本Activity中的UI組件。
                要讓線程動態改變UI組件的屬性值,必須藉助於Handler。
  2. Handler的使用:在新啓動的線程中發送消息。在主線程(UI線程)中獲取消息並處理。
  3. Handler使用步驟:
     1) 在主線程中創建Handler子類對象,並重寫處理消息的方法(handlerMessage())。
     2) 在新啓動的線程(子線程)中創建消息併發送。

  4. Message消息對象的常用屬性:
1) int what: 標識消息的一個識別碼(整數值)
2) Object obj: 用於傳遞數據的一個Object屬性。
  5. Handler類的常用方法:
1) 構造方法:
Handler()
Handler(Handler.Callback callback); //傳入用於處理消息的回調接口
2) 處理消息(用於被重寫)
public void handleMessage (Message msg);
3) 發送消息
public final boolean sendEmptyMessage(int what)
public final boolean sendMessage(Message msg)
public boolean sendMessageAtTime(Message msg, long millis)
public final boolean sendMessageDelayed(Message msg, long millis)
4) 從消息池中取出一個消息
public final Message obtainMessage()
public final Message obtainMessage(int what)
public final Message obtainMessage(int what, Object obj)

三、android.os.AsyncTask 異步任務:封裝好了多線程及Handler機制
 1. 構造時的三個模板參數:
Params:傳遞給後臺任務的參數類型。(如:遠程圖片的URL地址)
Progress:後臺計算執行過程中,進度單位(progress units)的類型。
Result:後臺執行返回的結果的類型。

2. 五個回調方法:
1) onPreExecute():準備運行後臺任務時。一般做一些初始化工作(如:顯示進度對話框)。 注意,這個方法在UI線程(主線程)中執行
2) doInBackground(Params...):正在後臺運行。在後臺線程中執行。一般編寫需要在後臺線程中執行的代碼。注意,這個在後臺線程中執行
3) onProgressUpdate(Progress...):進度更新時。一般就是更新進度顯示。注意,這個方法在UI線程(主線程)中執行。一般在doInBackground()方法中調用publishProgress()方法來觸發。
4) onPostExecute(Result):後臺任務完成後。一般做一些清理資源工作(如:隱藏進度對話框)。 注意,這個方法在UI線程(主線程)中執行
5) onCancelled():取消任務時。一般做一些清理資源工作

3. 執行異步任務的方法:
MyAsyncTask task = new MyAsyncTask();
task.execute(Params...);

4. 取消異步任務的方法:
task.cancel(true);

5. AsyncTask的實例必須在UI線程(主線程)中創建?
execute()方法必須在UI線程(主線程)中調用
該AsyncTask只能被執行一次,多次調用時將會出現異常

 

發佈了3 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章