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的关系不清的,可以看看其他博文,这里直接上代码了
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的关系了,可以更加深入理解
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的关系了,可以更加深入理解
相关文章推荐
- Android之.9.png图片使用
- android数据存储和访问
- Android Socket UDP通信的简单演示
- android开发遇到的各种bug
- android的listview中setselection()不起作用的解决方案
- android添加背景音乐
- Ubuntu 下Android开发常用命令笔记
- Android L中的RecyclerView 、CardView 、Palette的使用
- Android中SQLite的增删改查
- Android View动画
- Android-RecyclerView-Item点击事件设置
- android 与javascipt 之间相互调用
- 为自己记----android中关于actionbar的一些简单理解
- Android Web 应用开发详解
- android 自动登录和记住密码
- android 反编译
- PHP后台2:客户端(IOS/Android)Post请求以及JSON数据编解码
- android-service的简单用法
- android studio 开发 gradle 详解(五)
- android-percent-support-lib-sample