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{
    }
   }
});


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值