最根本的原因是解决多线程并发问题
如果在一个activity中有多个线程去更新UI,并且没有加锁机制,那样会造成更新界面错乱。
也不能对所有更新UI的操作进行加锁,否则会导致性能下降 。
Handler封装了消息的发送,解决多线程并发引发的问题,地址就是Messagetarget(默认情况发送给自己)
Looper是消息承装的载体,内部包含一个消息队列,MessageQueue是消息队列,Looper.Looper是一个死循环,不断从MessageQueue中去消息,如果有消息就处理消息,没有消息就阻塞。
Handler与Looper的关联方式体现在其构造函数上。
简而言之就是:handler负责发送消息,Looper负责接收Hanlder发送的消息,并且直接把消息回传给Handler自己,Message是一个消息的队列
整个应用程序都是通过ActivistThread 创建的,在它当中去负责创建所有的activity并回掉activity中的各种方法,所有更新UI的线程,在ActivityThread中默认去创建一个main线程,所有更新UI的线程都是通过main去创建的
在创建main线程当中会默认地给我们创建一个Looper,在创建Looper过程中会创建MessageQueue
先来看看Handler的构造函数中是如何与Looper关联的:
public Handler(Callback callback, boolean async) {
if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}
//在创建main线程当中会默认地给我们创建一个Looper,在创建Looper过程中会创建MessageQueue
//通过此方法获得Looper
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
//通过Looper获取MessageQueue
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
下面图解Handler机制原理:
上厕所(Message要干的事情)干的是情是只有自己(Handler)才能做,老师(Looper)是帮不了你做的,老师能维护上厕所的秩序不混乱。
以上是我个人的理解,如有瑕疵,欢迎指出。
如果想了解Handler的一些常用方法以及例子请看
http://blog.csdn.net/gpwner/article/details/52557618