Handler在开发中作用有如下两个:
1. 异步更新UI
2. 延时任务
在Android中,通常子线程做耗时操作,主线程异步更新UI
android中使用 线程+handler 来解决 这一难题
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
mTestTV.setText("This is handleMessage");//更新UI
break;
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);//在子线程有一段耗时操作,比如请求网络
mHandler.sendEmptyMessage(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
下面使用Post方法来实现,子线程负责耗时工作,主线程负责异步更新 操作
private Handler mHandler;//全局变量
@Override
protected void onCreate(Bundle savedInstanceState) {
mHandler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);//在子线程有一段耗时操作,比如请求网络
mHandler.post(new Runnable() {
@Override
public void run() {
mTestTV.setText("This is post");//更新UI
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
再举个例子:
private TextView tv_up;
private String new_str = "";
/*post方法解决UI更新问题handler创建方式*/
private Handler handler_post = new Handler();
/*sendMessage方法解决UI更新问题handler创建方式*/
Handler handler_senM = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
tv_up.setText(new_str);
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
new_str = "更新UI";
/*sendMessage方法解决UI更新发送消息给handler(主线程中的handler)*/
handler_senM.sendEmptyMessage(1);
/*post方法解决UI更新,直接在runnable里面完成更新操作,这个任务会被添加到handler所在线程的消息队列中,即主线程的消息队列中*/
handler_post.post(new Runnable() {
@Override
public void run() {
tv_up.setText(new_str);
}
});
}
}).start();
}
最终总结:
1. post和sendMessage本质上是没有区别的,只是实际用法中有一点差别
2. post也没有独特的作用,post本质上还是用sendMessage实现的,post只是一中更方便的用法而已
FR:海涛高软(hunk Xu) QQ技术交流群:386476712