Handler与Looper经常用在异步消息处理里,当然大部分时间是与线程集合起来进行异步通信及处理的。
Android中的异步消息处理涉及Handler、Looper、Message和MessageQueue如下 :
1 Handler
Handler主要是消息发送和接收的处理者,负责发送Message到消息队列,以及处理Looper分派过来的Message。
Handler类可用于在主线程和工作线程中收发消息,Handler对象在工作线程中发送消息,该消息发送至消息队列中后等待处理。
在主线程中,Handler从消息队列中接收消息,并根据消息中的信息决定如何更新主线程中的UI。
2 Looper
Looper扮演MessageQueue和Handler之间的桥梁角色,负责消息循环和消息派发,其去循环取出MessageQueue中的Message,并将取出的Message交付给相应的Handler处理。
Android应用程序是消息驱动的,Android系统提供了消息循环机制Looper,通过Looper和Handler实现消息循环机制。
Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。在Android系统中,Looper负责管理线程的消息队列(Message Queue)和消息循环。
3 MessageQueue
Message类用于存放消息中的数据,在通信时负责相关信息的存放和传递,类似于一个实体对象。
MessageQueue顾名思义就是消息队列,它是采用单链表的数据结构来存储消息列表,用来存放通过Handler发过来的Message,按照先进先出的顺序执行。
4 Handler 的一般用法
Activity 中创建一个Handler,然后在子线程中发送消息。
public class MainActivity extends AppCompatActivity {
private TextView tv_text;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
// 把UI线程发送来的消息显示到屏幕上
tv_text.setText("what=" + msg.what + ", " + msg.obj);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_text = findViewById(R.id.tv_text);
// 在UI线程中开启一个子线程
new Thread(new Runnable() {
@Override
public void run() {
// UI线程发消息
Message msg = Message.obtain();
msg.what = 1;
msg.obj = "向UI线程中发送消息!";
// 向子线程中发送消息
handler.sendMessage(msg);
}
}).start();
}
}
5 Handler 的另一种用法 需要注意
子线程中创建的Handler,然后从主线程向子线程中发送消息。
public class MainActivity extends AppCompatActivity {
private Handler handler;
private TextView tv_text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_text = findViewById(R.id.tv_text);
// 在UI线程中开启一个子线程
new Thread(new Runnable() {
@Override
public void run() {
// 在子线程中初始化一个Looper对象
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
// 把UI线程发送来的消息显示到屏幕上
Log.i("info", "what=" + msg.what + ", " + msg.obj);
break;
}
}
};
// 把刚才初始化的Looper对象运行起来,循环消息队列的消息
Looper.loop();
}
}).start();
tv_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// UI线程发消息
Message msg = Message.obtain();
msg.what = 1;
msg.obj = "向子线程中发送消息!";
// 向子线程中发送消息
handler.sendMessage(msg);
}
});
}
}
联系客服