本文主要是介绍android中handlerthread与handler + thread区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
工作之间随手写的,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;@Overrideprotected 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//创建handlerthreadhandlerthread = new HandlerThread("shaohandler");handlerthread.start(); secondhandler = new Handler(handlerthread.getLooper(), new Handler.Callback() { //这里的looper是开辟thread中的looper,专门负责这个线程的消息处理 @Overridepublic boolean handleMessage(Message msg) {Log.i("shao", "SecondHandler.CallBack::::" + Thread.currentThread().getId());return false;}});secondhandler.post(new Runnable() {@Overridepublic 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() {@Overridepublic void run() {// TODO Auto-generated method stubLog.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的关系了,可以更加深入理解
这篇关于android中handlerthread与handler + thread区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!