首页 > 代码库 > handler机制分析

handler机制分析

最近感觉Handler不是非常懂,所以阅读了Handler的源码。先翻译一段源码中对Handler的介绍:Handler通过线程的MessageQueue允许你发送、处理Message和Runnable对象。每一个Handler实例都关联一个单独的线程和线程的消息队列。当你创建一个新的Handler,从这时起这个Handler被绑定在线程和线程队列上,它将为消息队列提供消息和runnable,并且处理它们就好像是从消息队列里取出来的一样。Handler两个主要的用法是,1:按进度处理消息和在未来的某一个时间执行操作;2:在你的线程之外的其它线程排队处理活动。

在程序中如果使用timer给handler发送消息,不取消timer,则即使按返回键退出应用程序以后,timer可能还在执行。同时从timer发送给handler的数据,handler也会接收成功;(当然可以通过取消timer停止发送消息)
同样的如果异步请求网络,当网络请求返回成功,通过handler发送消息,此时页面不存在时,也会出现空指针错误。

因此需要给handler上Looper,这样就可以控制handler是否可以接收到消息。防止在切换页面时,给handler发送了消息,但此时在下一个页面,从而引起空指针错误。多个handler可以共同使用一个Looper。示例代码:
private Handler handler;
 private Looper looper;
 
 private Thread myThread=new Thread()
 {
  public void run()
  {
   Looper.prepare();
   looper=Looper.myLooper();
   handler=new Handler(looper)
   {
    @Override
    public void handleMessage(Message msg)
    {
     Log.d("test","what="+msg.what);
    }
   };
handler2=new Handler(looper,new Handler.Callback()
   {
    @Override
    public boolean handleMessage(Message msg)
    {
     Log.d("test","what2="+msg.what);
     return false;
    }
   });
   Looper.loop();
  }
 };


在按钮中控制
Button btn=(Button)findViewById(R.id.stop_btn);
btn.setOnClickListener(new OnClickListener()
        {
   @Override
   public void onClick(View v)
   {
    if(flag)
    {
     looper.quit();
    }else{
    }
   }
});


handler机制分析