編輯:關於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中LinearLayout、AbsoluteLayout的用法,希望能對於初學Android的朋友起到一點幫助作用。具體內容如下:Androi
Android Studio與SVN版本控制程序的協作使用指南
AndroidStudio 的SVN 安裝和使用方法與我以前用的其他IDE 都有很大差別,感覺特麻煩,網上相關資料很少,貌似現在 Git 比較流行,之前有用過 githu
Android開發--滑動側邊欄的實現
在Android應用開發中,滑動側邊欄經常使用,今天我也試著自己進行了一個簡單的實踐,雖然功能還不是很強大,但是可以保留下來為以後的開發使用,有需要時在進行簡單的修改。實
Android 學習(三)下: UI 控件
· ·點此進入上篇: Android 學習(三)上: UI 控件 · · · · ·AnalogClock和DigitalClock // 獲得當前的時間,獲得小時和分鐘