在android工程中调用handler的sendMessage函数,是不是异步操作?我带着这样一个好奇的心做了一个测试。
在activity中添加一个按钮,并且添加它的事件,其中handler的sendMessage函数是在一个新开启的线程中执行:
Button btn = (Button)findViewById(R.id.btn1);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new Thread(){
@Override
public void run() {
mHandler.sendMessage(mHandler.obtainMessage(1)); // 向主线程发送消息
Log.i("synchronous", "sendMessage over!");
}
}.start();
}
});
然后在activity中(UI线程)定义handler:
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == 1){
try {
Thread.sleep(1000); // 主线程休息两秒钟
Log.i("synchronous", "sleep over!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
super.handleMessage(msg);
}
};
程序启动,在模拟器中点击该按钮,Logcat中显示日志的先后顺序如下:
09-13 10:14:06.916: I/synchronous(636): sendMessage over!
09-13 10:14:08.043: I/synchronous(636): sleep over!
足以可见,handler的handleMessage和新开启的线程之间是异步操作的。