Handler浅记

来源:互联网 发布:淘宝网买男鞋 编辑:程序博客网 时间:2024/06/07 04:08

      前言:::::::::: 

                                              相信所有Android的朋友,都知道Handler吧,常常用Handler用来协助非ui线程与ui线程通信,没办法,谁让View只能在ui线程中更新,而ui线程又不能做耗时的操作,不然操作系统就给你弹出个ANR!所以耗时操作我们就要放到非ui线程中去搞,这时候一般搞完,还是需要更新View的,问题来了,非ui线程不能更新ui上的View,我就草了!!!!没关系,我们有Handler,有了Handler的实例对象,一切都不是梦!!

   

      1、新手看Handler,那就是两行泪………………原因是???

答:对线程、进程知识掌握不牢固,一看到Ui线程(主线程),就慌了神,对,先别乱,在java中一根线程,就是Thread的一个实例对象啊。 那么在Android中,这个线程类就是ActivityThread,是的,没错,Ui线程就是ActivityThread的一个实例对象而已。。。。………………


       2、我们常常在Ui线程下创建一个Handler实例对象,此时该Hanlder就与当前的线程(Ui线程)绑定在一起了,谁让Handler是在当前线程中创建的呢,去取CurrentThread,一下子就拿到,而当前的Ui线程下面还有个Looper,Looper里面又创建了MessageQueue,这个容器里面放的又是Message,而Looper一直不停的在MessageQueue里面放入和取出Message。那Message是哪来的? Handler就是干这个的,发送Message到MessageQueue里面,Looper拿到Message过滤一遍,再发送给匹配的Handler,这样一个循环就诞生了,欧耶。


        3、详细说一下过程,看下面

              a、首先ui的更新不是线程安全的(也就是说多个线程同时可以更新View的状态),如果是这样,那Ui不就乱套了吗?大牛们当然有办法了,限制一下线程,只有Ui线程可以更新View,其它线程更新View一律抛出异常

              b、这样就带来新的问题了,那读取数据库、发出网络请求后更新View,这些操作很消耗性能啊,毕竟一个ui线程还要响应用户的事件啊,此时ui线程却在发网络请求……堵塞了…………,给用户的感觉就是卡住不动了

              c、大牛们说,那就把耗时操作放到工作线程里吧,可是带来问题是,我工作线程最后还是要更新View的啊,你上面限制只有Ui线程可以更新View,我工作线程怎么办??

              d、大牛们又说了,你工作线程完成后,把要更新的数据交给我ui线程,我ui线程来帮你更新View,ui线程说我这里有个循环消息处理器,你给我发Message就行,谁来发也要限定一下(就像对接人一样),Handler就这样产生了,工作线程通过Handler(ui线程中的),可以发送Message或者Task交给Ui线程,Ui线程,再转发给对应的Handler进行处理。

              e、通过Handler就完成了工作线程与ui线程的通信,最后的操作仍然是在ui线程中的Handler中进行, 更新View也变的妥妥的,你不得不佩服Google工程师们,老子跪拜!!!!!



       


0 0
原创粉丝点击