編輯:關於Android編程
關鍵字:Android 使用handler實現線程間發送消息 (主線程 與 子線程之間)、(子線程 與 子線程之間)
相信大家平時都有使用到異步線程往主線程(UI線程)發送消息的情況。本文主要研究Handler的消息發送。包括主線程往子線程發送消息,子線程之間互相發送消息。
一、主線程向子線程發送消息。
實現過程比較簡單:
主線程發送消息到異步線程,異步線程接收到消息後在再發送一條消息給主線程。
1. 初始化主線程的Handler,用來接收子線程的消息。
2. 啟動異步線程,在異步線程中創建Looper,並初始化一個異步線程的Handler。
3. 主線程獲取異步線程的Handler(這裡涉及到線程間同步的知識),並向異步線程發送消息。
4. 異步線程Handler接收到消息以後,獲取主線程的Handler,並向主線程發送消息。
5. 主線程收到異步線程發來的消息。
注:
1. 這裡說的主線程Handler或者異步線程Handler,指的是綁定在對應線程消息隊列上的一個Handler對象而已,在Handler的構造函數中傳入對應線程的Looper對象即可。
2. 為什麼要使用線程鎖來處理,是因為異步線程啟動不是實時的,主線程獲取異步線程的Handler時有可能為空,如果為空,需要等待異步線程先初始化Handler。
上代碼:
package com.example.chen.myapplication; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; /** * 用Handler測試主線程往子線程發送消息 * @author chen */ public class HandlerSimpleActivity extends Activity { private Handler mainHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 啟動異步線程 final AsyncThread asyncThread = new AsyncThread(); asyncThread.start(); // 初始化主線程的Handler mainHandler = new Handler(Looper.myLooper(), new Handler.Callback() { @Override public boolean handleMessage(Message msg) { // 主線程收到消息 Log.e(HandlerSimpleActivity.class.getSimpleName(), MainHandler Receiver Message curThread = + Thread.currentThread().getName()); return false; } }); // 獲取異步線程的Handler Handler handler = asyncThread.getHandler(); if (handler != null) { Log.e(HandlerSimpleActivity.class.getSimpleName(), MainThread Send Message curThread = + Thread.currentThread().getName()); // 向異步線程發送消息 handler.sendEmptyMessage(0); } } /** * 異步線程 */ private class AsyncThread extends Thread { private Handler handler; @Override public void run() { super.run(); Log.e(HandlerSimpleActivity.class.getSimpleName(), AsyncThread Start curThread = + Thread.currentThread().getName()); Looper.prepare(); // 初始化異步線程的消息循環隊列 if (handler == null) { synchronized (AsyncThread.class) { // 線程間安全 // 為異步線程的消息循環隊列新增一個Handler handler = new Handler(Looper.myLooper(), new Handler.Callback() { @Override public boolean handleMessage(Message msg) { // 異步線程收到消息 Log.e(HandlerSimpleActivity.class.getSimpleName(), AsyncHandler Receiver Message curThread = + Thread.currentThread().getName()); // 異步線程發送消息到主線程 Log.e(HandlerSimpleActivity.class.getSimpleName(), AsyncThread Send Message curThread = + Thread.currentThread().getName()); mainHandler.sendEmptyMessage(0); return false; } }); // 異步線程Handler初始化完畢 Log.e(HandlerSimpleActivity.class.getSimpleName(), AsyncHandler Inited curThread = + Thread.currentThread().getName()); // 釋放鎖 AsyncThread.class.notifyAll(); } } Looper.loop(); } /** * 獲取異步線程的Handler * @return */ public Handler getHandler() { if (handler == null) { synchronized (AsyncThread.class) { // 線程間安全 if (handler == null) { try { // 獲取異步線程的handler為空,釋放鎖,等待異步線程初始化完畢。 Log.e(HandlerSimpleActivity.class.getSimpleName(), getHandler wait curThread = + Thread.currentThread().getName()); AsyncThread.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } // 異步線程Handler初始化完畢,主線程繼續 Log.e(HandlerSimpleActivity.class.getSimpleName(), getHandler notified curThread = + Thread.currentThread().getName()); return handler; } else { return handler; } } } else { return handler; } } } }
上結果截圖:
二、子線程間使用Handler互相發送消息:
2015年7月26日19:47:31 等待下次更新(*^__^*) 嘻嘻……
本文實例介紹了Android中LinearLayout、AbsoluteLayout的用法,希望能對於初學Android的朋友起到一點幫助作用。具體內容如下:Androi
AndroidStudio 的SVN 安裝和使用方法與我以前用的其他IDE 都有很大差別,感覺特麻煩,網上相關資料很少,貌似現在 Git 比較流行,之前有用過 githu
在Android應用開發中,滑動側邊欄經常使用,今天我也試著自己進行了一個簡單的實踐,雖然功能還不是很強大,但是可以保留下來為以後的開發使用,有需要時在進行簡單的修改。實
· ·點此進入上篇: Android 學習(三)上: UI 控件 · · · · ·AnalogClock和DigitalClock // 獲得當前的時間,獲得小時和分鐘