1. 程式人生 > 其它 >Android主執行緒、子執行緒通訊(Thread+handler)

Android主執行緒、子執行緒通訊(Thread+handler)

Android是基於Java的,所以也分主執行緒,子執行緒!
主執行緒:實現業務邏輯、UI繪製更新、各子執行緒串連,類似於將軍;
子執行緒:完成耗時(聯網取資料、SD卡資料載入、後臺長時間執行)操作,類似於小兵;

一、子執行緒向主執行緒發訊息(Thread+handler):

1、主執行緒中定義Handler:

Handler mHandler = new Handler(){  
  
    @Override  
    public void handleMessage(Message msg) {  
        super.handleMessage(msg);  
        switch (msg.what) {  
        case 0:  
            //do something,refresh UI;  
            break;  
        default:  
            break;  
        }  
    }  
      
};

2、子執行緒處理完耗時操作之後發訊息給主執行緒,更新UI:

mHandler.sendEmptyMessage(0);  

這樣在子執行緒與主執行緒任務分工的條件下完成了訊息互動;

二、主執行緒向子執行緒傳送訊息(Thread+handler):

主執行緒碰到耗時操作要子執行緒完成,此時發通知給子執行緒,操作步驟如下:

1、子執行緒中定義Handler,Handler定義在哪個執行緒中,就跟那個執行緒繫結,線上程中繫結Handler需要呼叫Looper.prepare();方法,主執行緒中不呼叫是因為主執行緒預設幫你呼叫了;

public class LoopThread implements Runnable {  
  
    public Handler mHandler = null;  
  
    @Override  
    public void run() {  
        Looper.prepare();  
        mHandler = new Handler() {  
            public void handleMessage(Message msg) {  
                String result = NetUtil.getJsonContent("北京");  
                //完成了獲取北京天氣的操作;  
                Log.i("test", "handler"+result);  
            }  
        };  
        Looper.loop();  
    }  
  
} 

其中Looper.prepare();和Looper.loop();維護了一個訊息佇列,等待訊息注入並在子執行緒中執行;

2、主執行緒中這樣呼叫:

lThread.mHandler.sendEmptyMessage(0);  

主執行緒向子執行緒發訊息,讓子執行緒執行指定的操作,在Android中還有一種方法,即:HandlerThread,看下面的例子:

HandlerThread handlerThread = new HandlerThread("jerome");  
handlerThread.start();  
  
/** 
 * 這裡要將HandlerThread建立的looper傳遞給threadHandler,即完成繫結; 
 */  
threadHandler = new Handler(handlerThread.getLooper()) {  
  
    @Override  
    public void handleMessage(Message msg) {  
        super.handleMessage(msg);  
        switch (msg.what) {  
        case 0:  
這兒可以做耗時的操作;  
            Log.i("jerome", "hello,I am sub thread");  
            break;  
        default:  
            break;  
        }  
    }  
};