前言
Handler是用于Android接收、传递、处理消息的处理类,结合Message、MessageQueue、Looper实现一个消息循环机制。
子线程向UI线程传递消息
创建Handler
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(TAG, Thread.currentThread().getName() + "收到消息:" + msg.obj);
}
};
由子线程发送消息
public void sendMessage(View view) {
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
Message message = mHandler.obtainMessage();
message.obj = Thread.currentThread().getName() + "发送消息";
mHandler.sendMessage(message);
}
});
mThread.setName("子线程");
mThread.start();
}
打印结果
简要说明
- 我们一般会在UI线程创建一个Handler,重写Handler的handleMessage(Message msg)方法,此方法返回的Message就是其他线程传递来的消息对象。
- 在子线程中通过Handler的obtainMessage()方法获取一个Message对象。通过Message.what标记信息int值方便接受消息的时候判断信息来源;通过Message.obj传递携带数据。
- 通过Handler的sendMessage()将消息发送;
子线程之间传递消息
创建Handler(在子线程中创建)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare(); // 1
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(TAG, Thread.currentThread().getName() + ": 收到" + msg.obj);
}
};
Looper.loop(); // 2
}
});
mThread.setName("线程1");
mThread.start();
}
发送消息(同样在子线程中)
public void sendMessage(View view) {
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
Message message = mHandler.obtainMessage();
message.obj = Thread.currentThread().getName() + "发送的消息";
mHandler.sendMessage(message);
}
});
mThread.setName("线程2");
mThread.start();
}
打印结果
简要说明
- 这里就要注意一下代码1、和代码2处了,为什么在开启子线程创建Handler需要做这两个操作,带着疑问,进入我们今天的主题。
源码解析
创建Handler
创建Handler最终会调用Handler的构造方法
public Handler(Callback callback, boolean async) {
if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static