欢迎使用CSDN-markdown编辑器
2016-04-25 17:55
387 查看
Android单线程模型
UI Threadthread Local
Looper
Message Queue
-Handler
UI Thread
即主线程,该线程属于不安全线程并且刷UI的行为必须在该线程执行。管理界面中的UI控件,进行事件分发
该线程在运行期间会通过Looper对象不断遍历Message Queue中的消息,并将其中的消息发送至该消息所指定的Handler对象。
thread Local
Android消息机制中的消息池通过消息池,Handler对象创建消息对象时会优先从消息池中获取,如果消息池中不存在消息对象的话便会在消息池中创建一个消息对象
该机制可以有效减少系统的垃圾回收行为。因为通过消息池,消息对象在不被使用时并不会被销毁而是放入消息池中,当下次需要创建消息对象时会复用消息池中已有的对象
Looper
用于线程间通信过程中的消息管理,每个线程都有其对应的Looper对象每个Looper对象都有一个指向其所在线程的指针和一个指向MessageQueue的指针。
Message Queue
消息队列,在Looper初始化时创建,通过Looper管理Handler将发送出去的消息push到MessageQueue(其Looper指向的MessageQueue,其Looper是哪个线程的Looper由你来决定,Handler和你所指定的线程共享该Looper指向的MessageQueue)
Handler
Handle用于线程间的通信Handle对象中包含了一个指向Looper和该Looper指向的MessageQueue的指针
总结
通过Handler进行线程间通信的流程:new一个Handle对象H并指定H的Looper,H发送消息,该消息将被push到Looper的消息队列MessageQueue中。Looper所属的线程会通过Looper将MessageQueue中的消息发回给与其共享一个MessageQueue的H,H回调他的handleMessage方法并接收该消息做为参数总而言之就是通过一个Looper绑定线程A和Handle对象H,之后可以通过H在另一个线程B中发出消息(可携带数据),消息会被push到该H中Looper指针所指向的MessageQueue,此时与H绑定在一起的A就会收到消息,A收到消息之后会通过Looper将该消息作为参数回调该消息所指定的Handle对象的handleMessage方法
示例:子线程B跟子线程C说你去通知主线程A来刷UI
public class Dxc extends Activity{
private Button b; private mhandler2 m2; Handler han=new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); b.setText("啊。。。。。。"); } }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.handler_main); //子线程B new Thread(){ public void run(){ SystemClock.sleep(10000); Looper.prepare(); mhandler1 m1=new mhandler1(Looper.myLooper()); m1.sendEmptyMessage(0); Looper.loop(); } }.start(); //子线程C new Thread(){ public void run(){ Looper.prepare(); m2 = new mhandler2(Looper.myLooper()); while(m2.yes){ SystemClock.sleep(1000); if(!m2.yes){ m2.sendEmptyMessage(0); break; } } Looper.loop(); } }.start(); } class mhandler1 extends Handler{ public mhandler1(Looper looper) { super(looper); // TODO Auto-generated constructor stub } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub m2.yes=false; } } class mhandler2 extends Handler{ private boolean yes=true; public mhandler2(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub han.sendEmptyMessage(0); } }
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories