Handler的post(Runnable)

  • 首先看一段在子线程中更新UI的操作
Handler  handler = new Handler();
//这是Button的点击事件
public void onClick(View v) {
                //开启子线程
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String str= null;//这里必须要写上 = null !!初始化
                        try {
                            Thread.sleep(3000);
                           str  = "网路请求得到的数据";
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                       // 这里也必须为final
                        final String finalStr = str;
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                //在这里将得到的数据直接更新到UI中
                                textView.setText(finalStr);
                            }
                        });
                    }
                }).start();
            }
  • 主要查看Handler.post()方法
    • 第一:生成Message对象
    • 第二:将Runnable对象放入到msg的callback属性中,并把msg放入MessageQueue消息队列中!
//Handler类中
 public final boolean post(Runnable r)
    {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }
// 1.首先查看 getPostMessage(Runnable r)方法: 返回msg对象
 private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();//得到Msg对象
        m.callback = r;
//将r对象赋值给msg的callback属性----msg的callback就是Runnable对象
        return m;
    }

//再来查看sendMessageDelayed(getPostMessage(r), 0);
//其实就等同于sendMessageDelayed(msg, 0);
// 2. 该方法下面一系列的操作就是将msg存入到消息队列中
public final boolean sendMessageDelayed(Message msg, long delayMillis)
    {
        if (delayMillis < 0) {
            delayMillis = 0;
        }
        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
    }
...........
  public static void loop() {
  //loop()方法中调用该方法
     msg.target.dispatchMessage(msg);
     }
//Handler类中的dispatchMessage()方法
public void dispatchMessage(Message msg) {
        //这里就是原因:Runnable对象不为空
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }
    //执行handleCallback()方法:里面直接执行了Runnable对象的run方法!而不是生成Thread对象并将r放入去执行start()方法!!!这样是不会另开线程的!!!,只能在原有的线程中执行run()方法!!!
     private static void handleCallback(Message message) {
        message.callback.run();
    }
  • 有点等同于iOS中的O-C中的block(不懂百度,我也不懂…) block语句块允许开发者 将一段代码当成一个变量传来传去!!
  • 所以用Handler.post()来充当该机制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值