Handler是Android中非常重要的類之一,通過Handler可以實現主線程的延時操作和線程之間的通信,通過在子類中的Handle、和Looper可以很輕松的實現一個請求隊列。
在寫代碼之前首先簡要的說一下 Handler、Looper、MessageQuene之間的關系。
每一個線程最多有一個Looper、一個Looper里邊含有一個MessageQuene。
Handler每次將消息發送到MessageQuene中,Looper用過一個死循環不斷的從MessageQuene中獲取消息,獲取后,根據Message的target分發給對應的Handler進行處理。
下邊是我寫的一個通過Handler和Looper實現的請求隊列:
package com.hou.looper; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; public class DemoLooperActivity extends Activity { private MyThread myThread = new MyThread(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /*********** 模擬兩個任務 ***********/ postToNoneUIThread(new Runnable() { @Override public void run() { try { Log.e("", "5 start"); Thread.sleep(5000); Log.e("", "5 end"); } catch (InterruptedException e) { e.printStackTrace(); } } }); postToNoneUIThread(new Runnable() { @Override public void run() { try { Log.e("", "1 start"); Thread.sleep(1000); Log.e("", "1 end"); } catch (InterruptedException e) { e.printStackTrace(); } } }); /*********** 模擬兩個任務OVER ***********/ } public void runOnNoneUIThread(Runnable r) { new Thread(r).start(); } /** * 放入到子線程隊列中 * */ public void postToNoneUIThread(Runnable r) { // 執行到這里的時候,子線程可能尚未啟動,等待子線程啟動,等待的時間會很短, while (myThread.handler == null) { } myThread.handler.post(r); myThread.handler.sendEmptyMessage(100); } /** * 可以設計為網絡請求隊列 * */ class MyThread extends Thread { { start(); // 類加載完成后直接啟動 } private Handler handler; @Override public void run() { while (true) { Looper.prepare(); // 創建該線程的Looper對象 handler = new Handler(Looper.myLooper()) { public void handleMessage(android.os.Message msg) { Log.i("handleMessage", "" + msg.what); }; }; Looper.loop(); // 這里是一個死循環 // 此后的代碼無法執行 } } } }