magic00 2013-03-16
在了解android线程之前得先了解一下android的进程。当一个程序第一次启动的时候,android会启动一个LINUX进程和一个主线程,默认的情况下,所有该程序的组件都将在该进程和线程中运行。同时,android会为每一个应用程序分配一个单独的LINUX用户。
Message、MessageQueue、Looper、Handler:
Message:线程间交流的信息,通过发送Message给UI线程(也就是主线程),其中包含了消息ID,消息处理对象以及处理的数据,由MessageQueue统一队列,Looper提取,最终由Handler处理。
MessageQueue:消息队列,用来存放通过Handler发布来的消息,按照FIFO的规则执行。存放Mesage当然并非实际意义的保存,而是将Message以链表的方式串联起来,等待Looper的提取。
Looper:消息泵,是每条线程里的MessageQueue的管家,不断的从MessageQueue中提取Message,因此,一个MessageQueue需要一个Looper。此处要注意的就是,android会自动为主线程建立MessageQueue,但在子线程里并没有,(一般线程只是用来处理庞大数据,处理完了就给主线程发送消息说我这边搞定了,你那边更新一下UI吧,并不接收消息,所以子线程里系统并没有自动生成这个线程的MQ)所以如果子线程中需要接收别的线程发过来的消息,必须初始化Looper,Looper和MessageQueue一一对应,创建一个Looper的同时会创建一个MessageQueue。
Handler:消息的发送者以及处理者(就像快递小哥,自己送件,也收件,不知道这个比喻的贴不贴切。。。感觉不贴切的 就自动pass掉这句话吧。)使用时需要handleMessage()方法来处理消息
关于这四个概念的理解,先写到这里,以后有了新的认识再追加。。。
四者之间的关系:
生成一个Message后,由Handler发送,然后MQ的入列,Looper提取,再交由Handler处理。这样就完成了异步操作。