Android为什么只能通过Handler机制更新UI

最根本的原因是解决多线程并发问题

如果在一个activity中有多个线程去更新UI,并且没有加锁机制,那样会造成更新界面错乱。
也不能对所有更新UI的操作进行加锁,否则会导致性能下降 。

Handler封装了消息的发送,解决多线程并发引发的问题,地址就是Messagetarget(默认情况发送给自己)
Looper是消息承装的载体,内部包含一个消息队列,MessageQueue是消息队列,Looper.Looper是一个死循环,不断从MessageQueue中去消息,如果有消息就处理消息,没有消息就阻塞。
Handler与Looper的关联方式体现在其构造函数上。

简而言之就是:handler负责发送消息,Looper负责接收Hanlder发送的消息,并且直接把消息回传给Handler自己,Message是一个消息的队列

整个应用程序都是通过ActivistThread 创建的,在它当中去负责创建所有的activity并回掉activity中的各种方法,所有更新UI的线程,在ActivityThread中默认去创建一个main线程,所有更新UI的线程都是通过main去创建的
在创建main线程当中会默认地给我们创建一个Looper,在创建Looper过程中会创建MessageQueue

先来看看Handler的构造函数中是如何与Looper关联的:

    public Handler(Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Handler> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                    klass.getCanonicalName());
            }
        }
//在创建main线程当中会默认地给我们创建一个Looper,在创建Looper过程中会创建MessageQueue
//通过此方法获得Looper
        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        //通过Looper获取MessageQueue
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

下面图解Handler机制原理:

这里写图片描述

上厕所(Message要干的事情)干的是情是只有自己(Handler)才能做,老师(Looper)是帮不了你做的,老师能维护上厕所的秩序不混乱。

以上是我个人的理解,如有瑕疵,欢迎指出。
如果想了解Handler的一些常用方法以及例子请看
http://blog.csdn.net/gpwner/article/details/52557618

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值