您的位置:首页 > 移动开发 > Android开发

android中handlerthread与handler + thread区别

2015-06-30 11:12 543 查看
工作之间随手写的,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的关系了,可以更加深入理解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: