android学习笔记——Handler

1、handler是一套消息处理机制(Activity的生命周期中状态的变化就是通过handler发送消息)和更新UI的机制(不能在非UI线程中跟新UI)

2、创建Handler时,所创建的Handler会与创建它的线程的MessageQueue进行绑定。

3、使用方法sendMessage(),sendMessageDelay(),Post(),PostDelay()。

4、对于post方法,参数都有一个Runnable对象,其本质是通过handler去调用Runnable对象的Run方法。Delay则会有一个延时调用的效果。

5、对于sendMessage方法,需要重写Handler的HandleMessage(Message)方法,在此方法中可以对UI控件进行操作。

      发送message,需要先创建一个Message对象(message默认有arg1-arg2l两个Int参数)。同时Message还有一个obj的参数,可以将需要的信息放入到message.obj中,然后调用Handler的sendmessage或者调用Message的sendToTarget发送消息。然后再在HandlerMessage中取得message的obj,就可以获得需要的内容。

6、在new一个Handler对象是可以利用含有CallBack参数的构造函数,实现callback类的handleMessage方法。这样做可以在Handler的HandleMessage处理消息前先拦截下消息,对其进行操作,操作完成后如果返回的是false,此消息再被handler中的handeMessage方法处理,如果返回true,则此消息被CallBack中的HandleMessage方法消化掉,不会进入Handler的HandleMessage方法中。


7、为什么android中要通过Handler去跟新UI:

     解决多线程并发问题(同步),无加锁机制。如果采用更新UI时使用加锁,又会降低性能。所以google提供了Handler这个更新UI的机制,不用去关心多线程问题,所有更新UI的操作都是在主线程的消息队列中去轮询处理。


8、handler原理(与Looper的不同):

    1)、Handler是封装消息的发送,主要包括发给谁(Message的Target,一般指向Handler自己,即一般都是发送给自己),如何发送。

    2)、Looper则是一个消息的载体,内部有一个MessageQueue,所有Handler发送的消息都走向这个消息队列。

              Looper.Looper()方法则是轮询MessageQueue中的消息,如果有消息则处理 否则就阻塞。

     3)、Handler会跟Looper进行关联,否则不知道把消息发送到哪。

     4)、Handler负责发送消息,Looper负责接收Handler发送的消息,并且把消息回传给Handler自己(是否相当于Windows编程中的系统消息队列???),MessageQueue则是一个消息的容器。


     进一步分析:

                          安卓的所有的Activity都是在ActivityThread线程中创建,在ActivityThread中会创建一个Looper,MessageQueue。Handler的构造函数中会与这个Looper进行关联,发送的消息则进入到MessageQueue。在Looper.loop(死循环)方法中会轮询消息,先判断发给谁(msg.target,默认是Handler自己),然后调用Handler的dispatchMessage方法。在Handler的此方法中会先判断消息是否被CallBack拦截,再决定要不要调用自己的HandleMessage方法。


9、实现自定义线程的Handler:

     先创建一个线程类继承Thread,先在内部创建一个Handler对象和一个Looper对象,然后实现其run方法。在run方法中先获得Looper对象:Looper.prepare();然后将之前的Handler对象实例化n  ew Handler(){

             //实现HandleMessage方法

                                  },最后在run中调用Looper.loop()方法。之后就可以创建此线程,利用此线程中的Handler对象的sendmessage方法。就会调用此子线程中的HandlerMessage。

   注:这与UI线程中的创建的Handler有区别,UI线程中的Handler的HandleMessage方法中最好不要处理比较耗时的操作,否则UI界面会无响应。

          默认情况下创建一个Handler,调用其HandleMessage方法都是在主线程中执行(可以在HandleMessage方法中打印一个Log,输出Thread.currentThread(),看是不是Thread(main,*,main)如果是则是在主线程中执行。否则会打印出Thread(Thread-*,*,main)main中子线程编号为*的子线程)。

          更多会用到HandlerThread(创建时构造函数需要传入一个名字),保证了线程的同步。然后在创建Handler时选择参数为Looper的构造函数,传入Handler对象的getLooper方法。这样此Handler的HandleMessage方法会在HandlerThread这个线程中执行。


10、主线程给子线程发送消息(平常更多是子线程给主线程发送消息让其更新 UI,就如同之前所写的Handler默认情况先绑定的都是主线程的Looper。所以其处理Message的方法都是在主线程中执行的)

        利用HandlerThread。创建一个Handler threadHandler将其与HandlerThread这个线程的Looper绑定。然后用threadHandler发送消息即可。



                          


你可能感兴趣的:(android,学习笔记,android)