android 工程中只有两类线程:ui线程和非ui线程。
ui线程是用来处理ui界面更新,非ui线程是用来处理一些耗时的服务,因为ui线程如果界面卡死20s,会报anr错误。当然这一切,目的这是要把这线程的分类概念让开发者彻底接受,并理解。
那么ui线程,和非ui线程,必然存在通信,非ui执行出结果,再消息推送致ui线程,ui线程处理接收到的结果,有可能更新ui。
这种消息机制的传递就是:handler+looper
handler 用来处理,looper用来存消息,它有消息队列。 一个线程都允许有且只有一个looper,一个handler【所以也可以没有】,至于handler是哪个线程的,它所依赖的looper决定。若构造函数无参,则依赖当前线程。自己线程的handler处理自己线程的消息队列中的消息。
message 是消息,它是一个结构体数据,它有what,when,arg1,arg2,obj 等属性。他的构造函数是无参的【new Message()】,但是通常情况下用handler.obtainMessage()。为什么呢?看源码:
public final Message
obtainMessage() { return Message.obtain(this);//this指的就是调用时‘.’前面的那个对象,其实就是handler罗。所以这一层已经实现了target }public static Message
obtain(Handler h) { Message
m = obtain(); m.target
= h; return m; }
public static Message obtain() {//这一层也就是最根本的,message是怎么来的。白话版就是:消息池有消息就取出来,给新对象赋值,没有 synchronized (sPoolSync) {//就new
一个。所以这个函数对 new Message()是一种包含关系。如果消息池有货,就可以省了开辟空间了
if (sPool != null) {
Message m = sPool;//看到没有这有个同步函数呢。。。。因为是多线程,为了不想这个逻辑行为,在具体多步执行时不被打断,就用同
sPool = m.next;//步实现原子性,但是同步嵌套的太多,就会造成死锁哦。。。
m.next = null;
sPoolSize--;
return m;
}
}
return new Message();
}
本文详细介绍了Android中UI线程与非UI线程的工作原理及通信机制,包括Handler与Looper的作用,消息队列的运作方式,以及Message的使用技巧。
184

被折叠的 条评论
为什么被折叠?



