1.简介
在Android系统中,只有主线程才能直接操作UI。分线程想更新UI或者向主线程传递消息可以利用Handler配合Message来实现。
Message的主要参数如下图:
其中arg1和arg0可以用来返回处理的结果,obj可以用于存放消息的数据结构,what用于表示消息的作用。
2.使用
- 主线程中初始化一个Handler对象,重写handleMessage方法(用于处理下消息的回调)。利用收到的Message的what属性来确定要做的响应。
private Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
if(msg.what == SIGNAL) {
tv_num.setText(num + "");
Toast.makeText(MainActivity.this, "收到分线程消息:"+msg.obj, Toast.LENGTH_SHORT).show();
}
}
};
- 在分线程中做完了任务想更新UI时,利用Message.obtain()来获取Message的实例对象,然后再设置Message对象的what和obj来向主线程发送消息。
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = Message.obtain();//obtain方法获取消息对象实例
message.what = SIGNAL;
message.obj = "这是分线程向UI线程发送的消息";
mHandler.sendMessage(message);
num++;
}
}
}).start();