在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和新开启的线程之间是异步操作的。