`
zhenzxie
  • 浏览: 66870 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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来处理事务了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics