先看一个示例
public class MainActivity extends Activity
{private Handler mHandler;
int what = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
f indViewById(R.id.button1).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mHandler.sendEmptyMessage(what ++);//主线程发送
new Thread("aaa")
{
public void run()
{
mHandler.sendEmptyMessage(what ++);//“aaa”子线程发送
}
}.start();
}
});
new Thread("自定义消息队列")
{//单线程处理所有线程发过来的消息,会以队列的顺序排队执行
public void run()
{
Looper.prepare();
//查看prepare()里80行和189行,创建了messageQueue、looper
mHandler = new Handler(Looper.myLooper())
//Looper.myLooper()得到当前线程的looper
{
//handler在哪个线程处理消息,取决于Looper在哪个线程创建
@Override
public void handleMessage(Message msg)
{
String content = "当前线程:" + Thread.currentThread().getName() + "msg:" + msg.what;
Toast.makeText(MainActivity.this, content, Toast.LENGTH_SHORT).show();
}
};
Looper.loop();//looper开始轮循队列
}
}.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
重点:Looper.loop() //looper开始轮循队列,这里一直在for循环处理消息
loop(looper.java) ->
msg.target.dispatchMessage(target就是指handler) -> handleMessage(msg) 这个就是上示例中实现的handleMessage方法
target的赋值,因为它是msg的成员变量,所以就可以猜到在handler发消息时,即mHandler.sendEmptyMessage(what ++)时会把本mHander赋给msg的成员变量target
流程: mHandler.sendEmptyMessage(what ++) -> sendEmptyMessage(int what) -> sendEmptyMessageDelayed
->
sendMessageDelayed -> sendMessageAtTime -> sendMessageAtTime
-> enqueueMessage(msg.target = this这里就是那个handler赋值的地方)。
Looper首先是取出来一个本地化线程下的Looper对象,然后取出该对象中的MessageQueue。然后在for(;;;)语句中循环去取出MessageQueue中的Message对象,然后调用message.target对象的dispatchMessage()方法分发消息,此时的target对象就是一个Handler对象。所以对于Looper类的理解就是:初始化一个MessageQueue和一个本地化变量的Looper,这样handler类就可以通过sendMessage等方法将消息添加到MessageQueue中,并且通过looper方法将消息不断的取出分发到对应的handler去处理。