handler.post和handler.sendMessage的区别和联系

现在大部分人都很熟悉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;

        }

    }

};

 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值