Android中Handler详解及使用示例
Android中Handler详解及使用示例
Handler是Android提供用于更新UI的一套消息处理机制。
主要作用有两个:
在新启动的线程中发送消息
在主线程中获取并处理消息
//1.实例化 Handler
//2.在子线程中发送空消息
//3.Handler对象接受消息,并处理
private Handler handler = new Handler() {
//只要Handler发了消息,必然会触发该方法,并且传入一个Message对象
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
textView.setText("received msg succeed !");
}
}
};
//子线程发送空消息给主线程的Handler处理
private void sendEmptyMessage() {
//模拟在线程
new Thread() {
@Override
public void run() {
//发送空消息给HandlerMessage
//这里相当于Message对象中的.what == 1;
handler.sendEmptyMessage(1);
}
}.start();
}
运行结果:
Message是在线程之间传递的消息,它可以在内部携带少量的
信息,用于在不同线程之间交换数据。
常用属性:
what属性
arg1属性
obj属性
private Handler handler = new Handler() {
//只要Handler发了消息,必然会触发该方法,并且传入一个Message对象
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
textView.setText("received msg succeed !");
} else if (msg.what == 2) {
int i = ((Random)msg.obj).nextInt();
Toast.makeText(MainActivity.this, "Random.nextInt() = " + i,
Toast.LENGTH_SHORT).show();
}
}
};
//子线程发送空消息给主线程的Handler处理
private void sendMessage() {
new Thread() {
@Override
public void run() {
//what:用于区分handler发送消息的不同线程来源
//arg1,arg2:如果子线程需要想主线程传递整型数据,则可用这些参数
//obj:Object
Message msg = new Message();
msg.what = 2;
msg.arg1 = 1234;
msg.arg2 = 2333;
msg.obj = new Random();
handler.sendMessage(msg);
}
}.start();
}
Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中 ,然后每当MesssageQueue中存在一条消息,Looper就会将这条消息取出,并将它传递到Handler的handleMessage()方法中。每个线程只有一个Looper对象。主线程默认有一个Looper。
MessageQueue就是消息队列的意思,它只要用于存放所有通过Handler发送过来的消息。这部分消息会一直存放于消息队列当中,等待被处理。
Handler handler2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testLooperThread();
handler2.sendEmptyMessage(2);
}
private void testLooperThread() {
new Thread() {
@Override
public void run() {
//开启Looper
Looper.prepare();
handler2 = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Toast.makeText(MainActivity.this,
"主线程传来的message.what:" + msg.what,
Toast.LENGTH_SHORT).show();
}
};
//Looper循环,相当于产生了一个while(true){...}
Looper.loop();
}
}.start();
}
一个线程只有一个Message Queue,Message通过MessageQueue.IdleHandler关联到该线程的Looper上,通过Looper.looper()来处理消息分发到该handler回调。
Looper、Message Queue、Handler的关系:
Android中Handler详解及使用示例相关教程