一、Android消息机制
Android的消息机制主要是指Handler的运行机制,Handler是Android消息机制的上层接口,在Android开发中,我们可以通过Handler轻松的将一个任务切换到Handler所在的线程中去执行。可以作为线程间的一种通信方式,也常用来更新UI。举个🌰:
当我们需要在子线程中进行耗时的I/O操作,可能是读取文件或者访问网络等,当耗时操作完成时,我们需要在UI上做一些改变,由于Android中子线程不能直接访问UI控件,否则会触发异常,这个时候我们就可以通过Handler将更新UI的操作切换到主线程中执行。
public class TestHandlerActivity extends Activity{
//在主线程中创建handler
private static Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle saveInstanceState){
super onCreate(saveInstanceState);
setContentView(R.layout.test_handler_activity);
Button btn = findViewById(R.id.btn_test);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void OnClick(View v){
//开启子线程
new Thread (new MyThread()).start();
}
});
}
public class MyThread implements Runable{
@Override
public void run(){
//进行耗时的IO操作,读取文件或访问网络等
...
//用handler更新UI
mHandler.post(new Runable(){
@Override
public void run(){
//更新UI
...
}
});
}
}
}
二、Handler机制的主要角色
- Message:handle接受和处理的消息对象,包含消息ID,消息处理对象和处理的数据等
- Handler:主要负责消息的发送和处理
- MessageQueue:采用单链表的存储形式,主要负责消息的接收和存储
- Looper:主要负责从MessageQueue中提取消息并交由Handle进行处理
整个运行流程如下图所示:
在Handler创建完毕后,这个时候Handler所属线程内部的Looper以及MessageQueue就可以和Handler一起协同工作了,然后通过Handler的post方法将一个Runable投递到Handler所属线程内部的Looper中去处理,也可以通过Handler的send方法发送一个消息到Handler所属线程内部的Looper中去处理。其实post方法最终也是通过send方法来完成的,而当send方法被调用时,它会调用MessageQueue的enqueueMessage方法将这个消息放入消息队列中;而Looper会不断调用MessageQueue的next方法来获取新方法,当MessageQueue中没有消息时,next会被阻塞(wait),当next有新消息到来时,Looper就会处理这个消息,也就是发送这条消息的handler的dispatchMessage方法,dispatchMessage方法会先检查message中是否含有post进来的runable是否为null,如果不为null就执行runable,否则调用handler的handleMessage方法。由于Looper是运行在创建Handler所在的线程中的,这样一来Handler中的业务逻辑就被切换到创建Handler所在的线程中去执行了。