Handler详解

转自:http://blog.csdn.net/bobo8945510/article/details/51864102


下面我们通过六大模块来了解下handler相关内容(有错误帮忙点出来,谢谢大家。我的理解还很片面和浅薄!)

一、什么是handler?

    答:handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它             处理消息。


二、那为什么要用handler呢?我能不能不用?

    答:我在网上搜了下,给我的答案是,肯定是不行的。因为android在设计的时候就封装了一套消息创建、传递、处理。如果不遵循就不能更新UI信息,就会报出异常。


三、Android为什么要设计只能用handler机制更新UI呢?

    答:最根本的目的就是为了解决多线程并发的问题

           打个比方,如果在一个activity中有多个线程,并且没有加锁,就会出现界面错乱的问题。但是如果对这些更新UI的操作都加锁处理,又会导致性能下降。

          处于对性能的问题考虑,Android给我们提供这一套更新UI的机制我们只需要遵循这种机制就行了。不用再去关系多线程的问题,所有的更新UI的操作,都是在主线程的消息队列中去轮训的。


四、handler、Looper、MessageQueue的原理是什么?

    答:大家都知道handler的作用有两个,发送消息和处理消息。而handler发送的消息必须被送到指定MessageQueue(消息队列)中,也就是说,如果想让handler正常工作,就必须有一个MessageQueue(消息队列),不过MessageQueue(消息队列)是由Looper来关系。所以也可以说想让handler正常工作,必须在当前线程中有一个Looper对象。(请认真读)


    1、来看一下Looper提供的构造器源码,如图:

 

你会发现该构造器用到的是private(私有化),告诉你的就是程序员你不能通过构造方法创建looper对象,而在方法中Looper创建了一个与关联的MessageQueue,这个MessageQueue就是用来管理Message(handler接收和处理的消息对象)!


   2、为了保证当前线程有Looper对象,可以有两种情况处理。(疯狂的Android讲义224页)

   (1)主ui线程启动,系统就初始化了一个Looper对象,只要在程序中直接创建handler即可,然后用handler发送和处理消息。
   (2)程序员自己创建的线程,这个时候就要自己手动创建一个Looper对象了,创建Looper对象调用它的prepare()。prepare()方法              是为了保证每个线程最多一个Looper对象。
      prepare()方法 源码如图。


    然后用Looper.loop()启动它。此时loop()方法就会使用一个死循环不断地取出MessageQueue()中的消息,并将消息分给所对应的Handler处理。


   好吧总结一下吧:

   微笑:Looper的作用:每个线程只有一个Looper,他负责管理MessageQueue,会不断的从MessageQueue取出消息,分发给对象              的handler

   微笑:MessageQueue的作用:由Looper管理,而MessageQueue则采用先进的方法来管理Message!

   微笑:Handler的作用:它把消息发送给Looper管理的MessageQueue,并负责处理Looper分发给他的消息。

   

六、Android在子线程更新UI的最常见的五种方式 (这里不讲解AsyncTask(异步任务))

     1、runOnUiThread()方法


     2、handler.post()方法


 

 3、handler.sendMessage()方法


     4、view.post()方法。


     5、view postDelayed(Runnable,long)

      前四种是慕课网老师讲解的,最后一种是疯狂Android讲义书籍上有的一种。如果想要详细了解,请点击链接:点击打开链接http://www.imooc.com/video/5725/0(慕课网讲的很详细,希望帮助到大家)。


 

六、非UI线程真的不能跟新UI吗?

    答:对着这个问题我就开始百度、查书籍、最后看慕课网,好吧!终于得到答案,答案就是:有些时候是可以更新UI的,在ViewRootImpl没有实例化的时候是不会check是否是主线程,也就是说,在非UI线程中是可以更新UI的。至于具体理论,我把下面的视频地址给贴上以方便小伙伴更详细的了解。点击打开链接(http://www.imooc.com/video/5726)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值