Android中的消息机制主要就是指Handler的消息机制,Handler相信大家已经非常熟悉了,它可以将一个任务切换到Handler所在的线程中去执行,开发中,当我们在子线程做了一些操作后需要更新UI,由于Android不允许在子线程中访问UI控件,所以我们一般都会使用handler来实现。
Handler的机制需要MessageQueue、Looper和Message的支持。他们在消息机制中各扮演了不同的角色
Handler:负责消息的发送和接收处理
MessageQueue:消息队列,一个消息存储单位,经常需要进行增减,内部使用的是单链表的结构
Looper:消息循环。会不停地从MessageQueue中取消息,如果有新消息就会立刻处理,否则就一直阻塞在那里
Message:消息载体
下面通过一段简单的代码来分析整个执行过程。
private TextView textView;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText("消息处理.....");
}
};
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.mytv);
new Thread(new Runnable() {
@Override
public void run() {
//模拟耗时操作
SystemClock.sleep(3000);
handler.sendMessage(new Message());
}
}).start();
}
就是在子线程中做了一些耗时操作后,通过Handler发送消息去更新UI
Hanlder是怎么接受到消息的呢?
Looper
Looper几个主要的方法
- Looper.prepare():为当前线程创建一个Looper
- Looper.loop():开启消息循环
- Looper.getMainLoop():可以在任何地方获取到主线程的
- Looper.quit():直接退出Looper
- quitSafely():设置一个标记,把消息队列的所有消息处理完后才会退出
//创建一个新的Looper并放到当前线程的ThreadLocal中去
private static void prepare(boolean quitAllowed){
if (sThreadLocal.get() !=