looper的机制分析。

先看一个示例

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去处理。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值