异步消息处理机制
- android中不支持在子线程中修改主线程的UI,这样会导致线程不安全,这是就需要用到android中的异步消息处理机制。
Message
- 是在线程之间传递的消息,可以在内部携带少量的信息,what、arg1和arg2用于存放整形数据,obj属性用于携带一个Object对象。
Handler
- 就是处理者的意思,主要用于处理和发送消息,发送消息一般用Handler的sendMessage方法,而处理消息一般用其中的handleMessage方法处理。
MessageQueen
- 消息队列的意思,主要用来存放所有通过Handler发送过来的信息,这部分消息会一直存在于消息队列中,等待被处理,每个线程中都会有一个MessageQueen对象。
Looper
- Looper是每个线程中MessageQueen的管家,调用Looper的loop()方法,就会进入到一个无限循环当中,每当MessageQueen中发现一条信息,就会将其取出,并传递到Handler的handleMessage()方法中。每个线程中只会有一个Looper对象。
消息处理流程图
- 消息处理流程图

- 示例代码如下
public class MainActivity extends AppCompatActivity {
public static final int UPDATE_TEXT = 1;
public static final int TIME_COUNT = 2;
private Button button;
private Button buttonTime;
private TextView textView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
buttonTime = (Button) findViewById(R.id.buttn_code);
textView = (TextView) findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
myHandler.sendMessage(message);
}
}).start();
}
});
buttonTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
int count = 10;
boolean isCount = true;
while (isCount) {
Message message = new Message();
message.what = TIME_COUNT;
if (count >= 0) {
message.obj = count + "秒后重新获取";
count--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
isCount = false;
message.obj = "获取验证码";
}
myHandler.sendMessage(message);
}
}
}).start();
}
});
}
private Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_TEXT:
textView.setText("我改变了哦");
break;
case TIME_COUNT:
buttonTime.setText(msg.obj + "");
}
}
};
}
- 效果图如下

主线程向子线程发送消息
- 一般情况下都是子线程操作主线程很少有主线程操作子线程。主线程操作子线程的方法同上,唯一的不同点就是子线程中如果创建Handler对象时,必须创建Looper,主线程自己封装了Looper,但是子线程创建Handler时,必须自己创建Looper。
- 代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
buttonTime = (Button) findViewById(R.id.buttn_code);
textView = (TextView) findViewById(R.id.textView);
button_main= (Button) findViewById(R.id.button_main);
button_sec= (Button) findViewById(R.id.button_sec);
button_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message message=new Message();
message.obj="我是主线程发来的消息";
handler.sendMessage(message);
}
});
button_sec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, msg.obj+"", Toast.LENGTH_SHORT).show();
}
};
Looper.loop();
}
}).start();
}
});
}
}
- 效果如图所示
