最近感觉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{
}
}
});