最近没事干又看了看Handler的机制,做一个大概的阐述。
对于初学者来说会用才是他们的当务之急,但是你要拜托菜鸟的帽子就必须深挖底层的东西。
先看看我们一般是咋用的:
private Thread mThread; private Handler mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: // do your thing; break; default: break; } }; }; public void startTask(){ new Thread(){ @Override public void run() { Message msg = mHandler.obtainMessage(); msg.what = 1; msg.arg1 = 2; mHandler.sendMessage(msg); } }.start(); }
这这几行的代码,有很牛逼的机制。
看看源码才知道是这样的:
首先从表面上理解这样几个概念:Message(消息) MessageQueue(消息队列) Looper(循环) Handler
他们是怎样协调工作的呢。
大概是这样的,在主线程中有且只有一个Looper循环,Looper中维护着一个MessageQueue(消息队列),Handler从消息池中得到一个Message对象,Handler将消息发送出去之后MessageQueue就会接收到这个Message对象,Looper发现自己的消息队列中有消息的话就会执行:
看最后一行,这是一个死循环,msg.targert是Handler的实例,并且这个Handler就是mHandler,也就是mHandler.obtainMessage();
这个Handler,你使用mHandler.obtainMessage()得到的消息,消息在被处理的时候还是mHandler,应为Message中有一个成员变量
Handler target。
大致就是这样: