handler消息处理机制的用法

这篇文章运用了实例代码展示了handler消息处理机制的使用方法,代码非常详细,解读可供感兴趣的小伙伴们参考借鉴,希望对大家有所帮助。        

Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列(Message Queue)和一个消息循环(Looper)。Android中除了UI线程(主线程),创建的工作线程默认是没有消息循环和消息队列的。如果想让该线程具有消息队列和消息循环,并具有消息处理机制,就需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。

class LooperThread extends Thread {  

   public Handler mHandler;  

   public void run() {  

         Looper.prepare();  

         mHandler = new Handler() {  

           public void handleMessage(Message msg) {  

               // process incoming messages here

            }  

         };  

        Looper.loop();  

    }  

}

Handler可以把一个Message对象或者Runnable对象压入到消息队列中,进而在UI线程中获取Message或者执行Runnable对象,所以Handler把压入消息队列有两大体系,Post和sendMessage。

Post:Post允许把一个Runnable对象入队到消息队列中。它的方法有:post(Runnable)、      postAtTime(Runnable,long)、postDelayed(Runnable,long)。

sendMessage:sendMessage允许把一个包含消息数据的Message对象压入到消息队列中。它的方法有:sendEmptyMessage(int)、sendMessage(Message)、sendMessageAtTime(Message,long)、sendMessageDelayed(Message,long)。


Message:Message是一个final类,所以不可被继承。使用Message.obtain()这个静态的方法或者Handler.obtainMessage()获取。Message.obtain()方法具有多个重载方法,大致可以分为为两类,一类是无需传递Handler对象,对于这类的方法,当填充好消息后,需要调用Handler.sendMessage()方法来发送消息到消息队列中。第二类需要传递一个Handler对象,这类方法可以直接使用Message.sendToTarget()方法发送消息到消息队列中,这是因为在Message对象中有一个私有的Handler类型的属性Target,当时obtain方法传递进一个Handler对象的时候,会给Target属性赋值,当调用sendToTarget()方法的时候,实际在它内部还是调用的Target.sendMessage()方法。


总结:一个Looper对应一个MessageQueue,一个线程对应一个Looper,一个线程可以有多个looper。


Handler handler = new Handler(){...}创建Handler。这样创建的handler是在主线程即UI线程下的Handler,即这个Handler是与UI线程下的默认Looper绑定的。HandlerThread实际上就一个Thread,只不过它比普通的Thread多了一个Looper。创建HandlerThread时要把它启动了,即调用start()方法。然后创建Handler时将HandlerThread中的looper对象传入。

HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();
mHandler = new Handler(thread.getLooper());
mHandler.post(new Runnable(){...});
那么这个Handler对象就是与HandlerThread这个线程绑定了(这时就不再是与UI线程绑定了,这样它处理耗时操作将不会阻塞UI)。

上文描述的就是handler消息处理机制的用法,具体使用情况还需要大家自己动手实验使用过才能领会。如果想了解更多相关内容,欢迎关注行业资讯频道!