handler机制分析

来源:互联网 发布:怎么解决网络协议冲突 编辑:程序博客网 时间:2024/05/01 16:33
最近感觉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