首先要了解一个简单的概念和handler的机制:
1、基本概念
Looper:消息泵,管理消息队列的。
MessageQueue:消息队列,管理消息,先进先出、后进后出。
Message:消息,要发送的内容。
2、handler工作原理(以子线程向主线程发消息为例)
首先要明确消息是由谁到谁,要在接收消息的一方new Handler(),并重写handleMessage()方法;在发消息的一方用handler发消息。

说明:
1)使用Message.obtain()方法获取Message的目的是通过消息池来控制消息,如果通过new Message()得到的Message需要自己管理。
2)发送的消息先存到MessageQueue中,Looper管理MessageQueue将消息传给handleMessage中进行处理。
3)主线程中的Looper是自带的,若是由主线程向子线程发消息,那么在子线程中new Handler()时,要先使用Looper.prepare()方法获取消息泵,使用Looper.loop()管理MessageQueue,否则会出现如下异常:
java.lang.RuntimeException: Can’t create handler inside thread that
has not called Looper.prepare()
4)若使用handler的post系列的方法发送消息,则不需要重写handleMessage方法,因为不会执行。
3、扩展
我们不但可以使用Handler发送消息,还可以使用message发送消息,但是必须指定目标处理器。
接下来就上几个小例子来帮助理解吧 ^_^
1)子线程向主线程发消息
private Handler mainHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 1){
textView.setText("子线程向主线程发消息");
}
}
};
/**
* 子线程向主线程发消息
* @param view
*/
public void threadToMain(View view){
new Thread(new Runnable() {
@Override
public void run() {
Message message = Message.obtain();
message.what = 1;
mainHandler.sendMessage(message);
}
}).start();
}
2)主线程向子线程发消息(不要在子线程更新UI哦)
/**
* 主线程向子线程发消息
* @param view
*/
public void mainToThread(View view){
threadHanler.sendEmptyMessage(0);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
textView = (TextView) findViewById(R.id.textView);
new Thread(new Runnable() {
@Override
public void run() {
//创建消息泵
Looper.prepare();
threadHanler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 0){
//TODO 接到主线程发来的消息进行相应的操作,不要更新UI哦
Log.e("------>","主线程发消息到子线程喽");
}
}
};
Looper.loop();
}
}).start();
}
3)使用post系列的方法发送消息(不用重写handleMessage哦)
private Handler postHandler = new Handler();
/**
* 使用post系列发消息
* @param view
*/
public void postSend(View view){
new Thread(new Runnable() {
@Override
public void run() {
postHandler.post(new Runnable() {
@Override
public void run() {
textView.setText("使用post系列发消息");
}
});
}
}).start();
}
4)使用message发送消息
private Handler messageHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText("使用message发消息");
}
};
/**
* 使用message发消息
* @param view
*/
public void messageSend(View view){
Message message = Message.obtain();
message.setTarget(messageHandler);
message.sendToTarget();
}
完整的代码如下:
package com.example.ws.learning.activity;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.example.ws.learning.R;
public class HandlerActivity extends AppCompatActivity {
private TextView textView;
private Handler threadHanler;
private Handler mainHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 1){
textView.setText("子线程向主线程发消息");
}
}
};
private Handler postHandler = new Handler();
private Handler messageHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText("使用message发消息");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
textView = (TextView) findViewById(R.id.textView);
new Thread(new Runnable() {
@Override
public void run() {
//创建消息泵
Looper.prepare();
threadHanler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 0){
//TODO 接到主线程发来的消息进行相应的操作,不要更新UI哦
Log.e("------>","主线程发消息到子线程喽");
}
}
};
Looper.loop();
}
}).start();
}
/**
* 子线程向主线程发消息
* @param view
*/
public void threadToMain(View view){
new Thread(new Runnable() {
@Override
public void run() {
Message message = Message.obtain();
message.what = 1;
mainHandler.sendMessage(message);
}
}).start();
}
/**
* 主线程向子线程发消息
* @param view
*/
public void mainToThread(View view){
threadHanler.sendEmptyMessage(0);
}
/**
* 使用post系列发消息
* @param view
*/
public void postSend(View view){
new Thread(new Runnable() {
@Override
public void run() {
postHandler.post(new Runnable() {
@Override
public void run() {
textView.setText("使用post系列发消息");
}
});
}
}).start();
}
/**
* 使用message发消息
* @param view
*/
public void messageSend(View view){
Message message = Message.obtain();
message.setTarget(messageHandler);
message.sendToTarget();
}
}