野人学Android第二弹——Handler与Thread之间的关系
2015-11-15 17:15
387 查看
在Android的世界里,提到Handler,那么势必要提到Thread。Thread是什么呢?很简单,就是“线程”的意思,通俗点讲,就是“一心二用”,在同一阶段进行多个任务。任务与任务之间是相对独立运行的,但是进行消息的传递,将次线程的结果告诉主线程,否则就失去了线程的意义。那么,Handler就是担任这个消息传递的角色。在比较正式的名词解释中,Handler是线程之间消息传递与处理的机制。
上面的解释有点抽象,不太好理解,那么下面来点代码,看下Thread和Handler之间的配合是怎样的。
这只是一个很简单的Handler与Thread的例子。基本逻辑:在主线程中实例化Handler,然后在次线程中将封装好的消息传递出去,主线程的handerMessage方法会接收到消息,进行消息的处理。其实,我刚才的解释有点不严谨,因为我还没有介绍Looper和MessageQueue这两个概念。先来看一张原理图。
原理解释:首先,Handler通过sendMessage这一方法将message传递到MessageQueue中,而Looper是循环机制,一旦MessageQueue中存在message,就会循环操作,传递给Handler的handleMessage方法进行操作。
关于这个原理图,需要强调的有几点:
1.一个线程只有一个Looper和MessageQueue;
2.MessageQueue和Looper是一一对应的;
3.一个MessageQueue和Looper可以对应多个Handler,但是一个Handler只能对应一个MessageQueue和Looper;
4.每个线程,包括主线程,实例化Handler,就需要创建Looper与调用,方法如下:创建,Looper.prepare();获取,Looper.myLooper();循环,Looper.loop();
5.主线程的Looper已经默认生成,所以就不需要另外创建;
6.MessageQueue的传出是按照“先进先出”的原则;
最后:
如果看到这里,你还是理解不了Handler与Thread之间的关系,没关系,建议你多百度几篇博文,静下心来慢慢琢磨,边写代码边思考,这样会有助于理解的。其实,我也是在工作之余,断断续续花了一个星期的时候去理解Handler的。
上面的解释有点抽象,不太好理解,那么下面来点代码,看下Thread和Handler之间的配合是怎样的。
Handler handler = new Handler(){//在主线程中实例化一个Handler @Override public void handleMessage(Message msg) {//handleMessage()是Handler处理消息的方法,可以将传递过来的消息进行处理,也可以直接用来更新UI super.handleMessage(msg); Log.i("info", msg.obj);//msg这个参数包括what,arg1,arg2,obj四个属性,这是和obtainMessage()相对应的,至于这四个属性的含义,请查下手册 } }; Thread thread = new Thread(new Runnable() { @Override public void run() { Message msg = handler.obtainMessage(1,11,11,"message from thread");//实例一个message,就是线程之间要传递的消息 handler.sendMessage(msg);//将封装好的消息传递出去 } }); thread.start();//启用次线程,如果没有start(),那么次线程就不会启用
这只是一个很简单的Handler与Thread的例子。基本逻辑:在主线程中实例化Handler,然后在次线程中将封装好的消息传递出去,主线程的handerMessage方法会接收到消息,进行消息的处理。其实,我刚才的解释有点不严谨,因为我还没有介绍Looper和MessageQueue这两个概念。先来看一张原理图。
原理解释:首先,Handler通过sendMessage这一方法将message传递到MessageQueue中,而Looper是循环机制,一旦MessageQueue中存在message,就会循环操作,传递给Handler的handleMessage方法进行操作。
关于这个原理图,需要强调的有几点:
1.一个线程只有一个Looper和MessageQueue;
2.MessageQueue和Looper是一一对应的;
3.一个MessageQueue和Looper可以对应多个Handler,但是一个Handler只能对应一个MessageQueue和Looper;
4.每个线程,包括主线程,实例化Handler,就需要创建Looper与调用,方法如下:创建,Looper.prepare();获取,Looper.myLooper();循环,Looper.loop();
5.主线程的Looper已经默认生成,所以就不需要另外创建;
6.MessageQueue的传出是按照“先进先出”的原则;
最后:
如果看到这里,你还是理解不了Handler与Thread之间的关系,没关系,建议你多百度几篇博文,静下心来慢慢琢磨,边写代码边思考,这样会有助于理解的。其实,我也是在工作之余,断断续续花了一个星期的时候去理解Handler的。
相关文章推荐
- Android listview 优化
- Android开发——Intent中的各种FLAG
- android 学习记录
- android drawable资源总结
- Android Studio的使用(八)--// TODO代码
- Android高效加载大图、多图解决方案,有效避免程序OOM---读后总结
- android向内存卡写入xml文件
- 各种Android大神的文章链接
- android99 拍照摄像
- 【Android】TextView 显示超链接的几种方法
- Android开发手记(27) Java多线程的操作
- Android四大组件之一Activity及其生命周期
- Android屏幕设置
- Android开发 设计模式 (三、Abstract Factory(抽象工厂模式))
- AndroidStudio问题记录:sRGB warning
- android跨进程通信(IPC):使用AIDL
- new android xml file时root element没有menu选项
- Java for android – Instanceof
- android加了进度条和进度文本多线程断点续传下载
- android 界面转换startActivity