Handler机制的初步理解

来源:互联网 发布:大数据金融的特点 编辑:程序博客网 时间:2024/05/16 04:09

handler机制

1. Handler 文档简单介绍:

         Handler类允许你发送和处理消息队列中的消息及runnable对象. Handler实例都是与一个线程和该线程的消息队列一起使用, 一旦创建新的Handler对象, 系统就把该实例和对应的线程及线程的消息队列进行捆绑, handler将发送消息和runnable对象到消息队列中,并当这些消息和runnable对象从消息队列出来后执行.

         Handler使用:

1)     定期处理message和runnable对象

2)     将对其他线程操作的对象放入到队列中,避免冲突.

定时处理消息的方法: post(Runnable),postDelayed(Runable, long); sendMessage(msg)等等. Post()方法可以将runnable对象发送给消息队列,并在消息队列接受后被调用.SendMessage()方法可以将含有数据的message对象发送到消息队列中,这些Message对象会被Handler类的handleMessage(msg)方法处理(需要创建一个继承Handler的子类).

         当一个进程启动时,主线程独立执行一个消息队列,该队列管理着应用顶层的对象(如:activities、broadcast receivers等等)和所有创建的窗口。你可以创建自己的一个线程,并通过handler来与主线程进行通信。这可以通过在新的线程中调用主线程的 handler的post和sendMessage操作来实现。

2 Handler 机制的图解:

3 Handler类中方法解析:

1.获取消息: 从消息池中获取Message,比new Message()更加便利.

 

底层都是通过target绑定Message来实现:

        

 

2. 发送消息: sendMessage()

        

底层都通过enqueueMessage()放入到消息队列中去:


3. post()执行runnable对象


handler在调用postXxx()方法时,

1)     将runnable实例赋给msg.callback, 获取到msg.callback的实例Message


2)     将Message拿到sendMessage()去消息队列:


3)     Looper轮询器拿到message后,会调用dispatchMessage(msg),此时msg.callback!=null;


4)     最后底层实现依赖:


4. dispatchMessage(msg):

         Looper轮询器拿到Message实例后, 通过msg.target.dispatchMessage()来处理消息.


5. remove() 移除message和handler



底层依赖:


        

5. 两个属性:

m.target=handler

m.callback= runnable

 

4 Handler的用法:

1. handler发送消息:-----//sendMessage()

         应用场景: 子线程网络请求检查是否需要更新, UI线程更改UI:

        

2. handler 实现定时更改UI,如ViewPager轮播图: ----//post(runnable)

         handler实现定时执行runnable对象,一般采用handler.postDelayed(runnable,long), 该方法只会执行一次, 要实现轮播,需要递归调用.

        

3. handler 带参构造函数:

        

5 更改UI的三种方式:

         Android中操作UI遵从原则:

        

1. Activity.runOnUiThread();

        

2. View.post(runnable);

        

3. handler.post(runnable)

 

6 handler实现子线程与主线程之间的通讯//TODO:

0 0