工作之间随手写的,handler + thread是初学者喜欢用的,为了不影响ui线程,开辟一个新的thread进行耗时操作,操作结束后需要更新ui,就需要通过handler进行
sendmessage来与ui线程通信,提醒一下在创建handler的时候,大部分初学者没有注意到参数Looper,它是负责不断循环处理线程中的message.很多人会问我没有注意创建
looper啊,这是系统默认在ui线程中创建了一个looper,这个looper就是负责ui线程的消息。简单的说当你开辟新的线程处理完耗时操作发送message后,handler中
handleMessage()方法就在ui线程中执行。
现在有一个场景,比如我发送请求想服务器下载图片,服务器返回图片后,我想把这张图片保存在本地,保存图片也是一个耗时操作,但是我不想在ui线程中执行保存操作,也不想重新开辟一个线程,简单的说图片请求与图片保存都在一个线程中执行就需要用到handlerthread,对于looper+handler+thread的关系不清的,可以看看其他博文,这里直接上代码了
public class MainActivity extends Activity {
//默认创建一个handler帮顶在ui线程上
private Handler handler = null;
private Button mbutton = null;
private HandlerThread handlerthread;
private Handler secondhandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("shao", "test handler");
mbutton = (Button)findViewById(R.id.shaobutton);
mbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//创建handlerthread
handlerthread = new HandlerThread("shaohandler");
handlerthread.start();
secondhandler = new Handler(handlerthread.getLooper(), new Handler.Callback() {
//这里的looper是开辟thread中的looper,专门负责这个线程的消息处理
@Override
public boolean handleMessage(Message msg) {
Log.i("shao", "SecondHandler.CallBack::::" + Thread.currentThread().getId());
return false;
}
});
secondhandler.post(new Runnable() {
@Override
public void run() {
Log.i("shao", "SecondHandlerThread" + Thread.currentThread().getId());
secondhandler.sendEmptyMessage(2);
}
});
}
});
//主线程有默认的looper就是与主线程绑定
handler = new Handler(new Handler.Callback() { //ui线程默认有自己的looper
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.i("shao", "Handler.CallBack::::" + Thread.currentThread().getId());
//System.out.println("Handler.CallBack::::" + Thread.currentThread().getId());
return false;
}
});
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.i("shao", "new thread::::" + Thread.currentThread().getId());
//System.out.println("new thread::::" + Thread.currentThread().getId());
handler.sendEmptyMessage(0);
}
}).start();
}
看一下运行结果:
06-29 23:20:46.274: I/shao(817): test handler
06-29 23:20:46.284: I/shao(817): new thread::::78
06-29 23:20:46.304: I/shao(817): Handler.CallBack::::1
06-29 23:20:55.194: I/shao(817): SecondHandlerThread79
06-29 23:20:55.204: I/shao(817): SecondHandler.CallBack::::79
这样就更加明白looper+thread+handler的关系了,可以更加深入理解