Android是基於Java的,所以也分主線程,子線程!
主線程:實現業務邏輯、UI繪制更新、各子線程串連,類似於將軍;
子線程:完成耗時(聯網取數據、SD卡數據加載、後台長時間運行)操作,類似於小兵;
一、子線程向主線程發消息(Thread+handler):
1、主線程中定義Handler:
Java代碼
- 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:
Java代碼
- mHandler.sendEmptyMessage(0);
這樣在子線程與主線程任務分工的條件下完成了消息交互;
二、主線程向子線程發送消息(Thread+handler):
主線程碰到耗時操作要子線程完成,此時發通知給子線程,操作步驟如下:
1、子線程中定義Handler,Handler定義在哪個線程中,就跟那個線程綁定,在線程中綁定Handler需要調用Looper.prepare();方法,主線程中不調用是因為主線程默認幫你調用了;
Java代碼
- 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、主線程中這樣調用:
Java代碼
- lThread.mHandler.sendEmptyMessage(0);
主線程向子線程發消息,讓子線程執行指定的操作,在Android中還有一種方法,即:HandlerThread,看下面的例子:
Java代碼
- 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;
- }
- }
- };