美文网首页
handler.post方法的终极最直观的理解与解释

handler.post方法的终极最直观的理解与解释

作者: 追风_9519 | 来源:发表于2018-07-23 10:17 被阅读0次

网上看了资料,都没有把为什么要用handler.post方法说清楚,云里雾里的。

1 先看用法1之主线程中使用:

new Handler().post(new Runnable() {
        @Override
        public void run() {
              mTest.setText("post"); //更新UI
        }
    });

可以看到,new了Runnable像是开启了一个子线程,但是不然,大家可以看到这儿调用的是run方法,而不是start方法,因此并不是子线程,其实还是在主线程中(关于run和start的概念不清楚的可参考:https://www.jianshu.com/p/6b11e57cdc17),那为什么又要使用post方法呢?其实一般不这样用,也没人这样用,并没有多大意义,这就像是在主线程中给主线程sendmessage,并没有什么意义(我们知道sendmessage是子线程为了通知主线程更新UI的),主线程是可以直接更新UI的。

2 再看用法2之子线程中使用:

new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            mTest.setText("post");//更新UI
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

由上面总结我们知道这儿的post并不是新开启的子线程,存在的子线程只有一个,即为new的Thread,那么为什么我们在其中可以settext做更新UI的操作呢? 其实post方法post过去的是一段代码,相当于将这个Runable体放入消息队列中,那么looper拿取的即为这段代码去交给handler来处理,其实也相当于我们常用的下面这段代码:

private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    mTest.setText("handleMessage");//更新UI
                    break;
            }
        }
    };

看起来熟悉吧,就是用这个Runnable体代替了上面这一大段代码,当然,我们的post方法就可以执行UI操作了。

平常情况下我们一个activity有好多个子线程,那么我们都会采用上面这种handleMessage(msg)方式,然后case 0:case 1:等等,但是当我们只有一个子线程时呢,用post反而比上面一大串代码轻便了不少,何乐而不为呢?

3 关于new Handler()与new Handler(Looper.getMainLooper())区别

如果你不带参数的实例化:Handler handler=new Handler(); 那么这个会默认用当前线程的Looper对象。

一般而言,如果你的Handler是要用来刷新UI的,那么就需要在主线程下运行。

情况:
1 要刷新UI,handler要用到主线程的Looper对象。那么在主线程Handler handler=new Handler() 如果在其他非主线程也要满足这个功能的话,要Handler handler=new Handler(Looper.getMainLooper());

2 不用刷新UI ,只是处理消息。当前消息如果是主线程的话,Handler handler=new Handler ;不是主线程的话,Looper.prepare() Handler handler=new Handler();Looper.loop() 或者Handler handler=new Handle(Looper.getMainLooper());

若是实例化的时候调用Looper.getMainLooper()就表示放到主线程中去处理。

若有不是的话,因为只有UI 线程默认Loop.prepare() Loop.loop()过,其他线程需要手动调用这两个。否则会报错。

(以上文章来源于网络)

相关文章

  • handler.post方法的终极最直观的理解与解释

    网上看了资料,都没有把为什么要用handler.post方法说清楚,云里雾里的。 1 先看用法1之主线程中使用: ...

  • 最直观的解释Java的多态

    用一句话概括就是:事物在运行过程中存在不同的状态。多态的存在有三个前提: 1.要有继承关系 2.子类要重写父类的方...

  • 我对Handler.post和view.post的理解

    我对Handler.post和view.post的理解

  • 教育目标|认知过程维度之理解

    理解的三个层次 理解主要分为三个层次,初级的理解,终极的理解和高级的理解,初级的理解,就是解释和举例,终极的理解指...

  • 异步编程方法

    前言 同步与异步最直观的理解:等到操作执行完成才返回执行结果的是同步操作;反之,则是异步操作 传统的异步编程方法:...

  • task1

    线性回归 反向传播算法 什么叫反向传播,有没有直观理解? 如何直观地解释 backpropagation 算法? ...

  • 常用向量相似度衡量指标

    1、欧氏距离(Euclidean Distance ) 欧氏距离是最容易直观理解的距离度量方法: (1)二维平面上...

  • Handler源码分析

    Handler使用方法 1、Handler.sendMessage() 2、Handler.post() hand...

  • 直观解释PCA

    是干什么的? 首先有一组数据蓝色点,PCA所谓的降维操作就是找到一个新的坐标系(旋转的两条直线式垂直的,我们可以用...

  • 直观解释SVD

    基本概念 SVD(singular value decomposition),奇异值分解 对称方阵可以分解成特征值...

网友评论

      本文标题:handler.post方法的终极最直观的理解与解释

      本文链接:https://www.haomeiwen.com/subject/yzedmftx.html