现在大部分人都很熟悉handler这个东西了,我们常用handler的场景无非有两个:
1. 异步更新UI
2. 延时任务
handler.post和handler.sendMessage本质上是没有区别的,都是发送一个消息到消息队列中,而且消息队列和handler都是依赖于同一个线程的。
接下来我们再结合实际应用中的例子来分析:
分别用sendMessage和post完成同样的异步更新UI的任务:
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) {
/*sendMessage方法更新UI的操作必须在handler的handleMessage回调中完成*/
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();
}
从这段代码中我们可以看出:
post和sendMessage只是用法上的区别,本质是没有区别的。
最终总结:
1. post和sendMessage本质上是没有区别的,只是实际用法中有一点差别
2. post也没有独特的作用,post本质上还是用sendMessage实现的,post只是一中更方便的用法而已
Handler
(Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息)
handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
它有两个作用:
(1):安排消息或Runnable在某个主线程中某个地方执行;
(2):安排一个动作在不同的线程中执行
Handler的post(r)方法和Handler的sendMessage方法
博客一:
一般来说在工作线程中执行耗时任务,当任务完成时,会返回UI线程,一般是更新UI。这时有两种方法可以达到目的。
一种是handler.sendMessage。发一个消息,再根据消息,执行相关任务代码。
另一种是handler.post(r)。r是要执行的任务代码。意思就是说r的代码实际是在UI线程执行的。可以写更新UI的代码。(工作线程是不能更新UI的)
博客二:
Handler.post()方法
消息发送代码:
在属性中声明
Handler handler=new Handler();
在非主线程中调用
handler.post(new Runnable(){
@Override
public void run() {
//do something to Update UI
}});
还有两种消息发送代码(仅供参考)
(1)
Message msg = new Message();
msg.what =1;
handler.sendMessage(msg);
(2)
Message msg = new Message();
msg.what =2;
msg.obj = bm;
handler.sendMessage(msg);
(3)
Message msg = new Message();
Bundle data = new Bundle();
data.putString("text", "正在下载...");
msg.what = 3;
msg.setData(data);
handler.sendMessage(msg);
*******************************************************************************
Handler.sendMessage方法
消息处理代码:
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1 :
bt.setText("正在下载...");
break;
case 2 :
Bitmap bm = (Bitmap) msg.obj;
iv.setImageBitmap(bm);
break;
case 3 :
Bundle bundle = msg.getData();
String data = bundle.getString("text");
bt.setText(data);
break;
}
}
};