首页 > 代码库 > handler机制分析
handler机制分析
最近感觉Handler不是非常懂,所以阅读了Handler的源码。先翻译一段源码中对Handler的介绍:Handler通过线程的MessageQueue允许你发送、处理Message和Runnable对象。每一个Handler实例都关联一个单独的线程和线程的消息队列。当你创建一个新的Handler,从这时起这个Handler被绑定在线程和线程队列上,它将为消息队列提供消息和runnable,并且处理它们就好像是从消息队列里取出来的一样。Handler两个主要的用法是,1:按进度处理消息和在未来的某一个时间执行操作;2:在你的线程之外的其它线程排队处理活动。
同样的如果异步请求网络,当网络请求返回成功,通过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机制分析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。