当前位置: 代码迷 >> Android >> Android学习之路——一.Handler,Message,Looper简介
  详细解决方案

Android学习之路——一.Handler,Message,Looper简介

热度:5   发布时间:2016-05-01 20:04:13.0
Android学习之路——1.Handler,Message,Looper简介
1.Handler允许你发送和处理关联着一个线程的消息队列的Message和Runnable对象。每一个Handler实例和一个单一的线程和这个线程的消息队列相关连。当它被创建时,它和线程,消息队列绑定了,它可以传递Message和Runnable对象到消息队列,然后执行他们,最后出队列。

2.Handler主要在两种情况下使用(1)安排Message和Runnable在未来某个时间执行。(2)将一个准备在不同于你的主线程的线程执行的动作入队。

3.安排线程主要用这些方法完成的:
post(Runnable),postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), sendMessageDelayed(Message, long) 
post版的方法允许将Runnable Objects入队,Runnable Objects将在消息队列接收它们的时候被调用。sendMessage版方法允许将含有数据的Message Objects入队,这些Message Objects将被Handler的handleMessage(Message)处理(要求继承Handler),并且只要Handler对象以主线程的Looper创建,那么调用Handler的sendMessage等接口,将会把消息放入队列都将是放入主线程的消息队列。并且将会在Handler主线程中调用该handler的handleMessage接口来处理消息。

4。内部接口Handler.Callback

 /**     * Callback interface you can use when instantiating a Handler to avoid     * having to implement your own subclass of Handler.     */    public interface Callback {        public boolean handleMessage(Message msg);    }

5.构造方法:
①:Handler()缺省构造方法,和当前线程的消息队列关联。
②:Handler(Handler.Callback callback)和当前消息队列关联,使用自己定制的实现callback接口的类来处理Message。
③:Handler(Looper looper)使用特定的队列。
④:Handler(Looper looper,Handler.Callback callback)使用特定的消息队列和自己的定制的实现Callback接口的类来处理Message。

6.Message:含有任意数据对象,能被发送到Handler。创建Message对象时推荐不要使用缺省构造方法,最好的方法是使用Message.obtain()或者Handler.obtainMessage()来获得Message对象,这些方法会从消息池中获得Message对象。

7.Message的常用实例域:int what用于区分Message,int arg1,int ag2(开销会比setData()),Object obj存储数据。Message 重要方法:obtain()从消息池中获得Message对象,setToTarget()将消息发送给特定的Handler对象,setTarget(Handler handler)绑定特定的Handler。

8.Looper:用于为一个线程运行消息循环的类,线程缺省是没有消息循环的,可以通过在线程中调用prepare()方法来获得,然后用loop()让他处理消息,知道循环结束。Looper和Hander配合使用,在API中的示例:
 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();           }  }

9.Looper的构造方法是private的,所以我们不能自己创建Looper对象,但是有HandlerThread类,通过创建HandlerThread对象并start,我们可以来获得Looper对象,进而传给Handler构造方法,这样我们可以在主线程外的线程使用Handler来处理事务了。

我是菜鸟,我犯错我开心,希望大家能不吝指教,谢谢啦!
             转载请注明来自http://zhenzxie.iteye.com/blog
  相关解决方案