在Android应用程序中,经常使用Handler进行消息处理。一般我们在当前Activity中直接新建一个Handler实例,然后重写其handleMessage方法即可。
如下所示:
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MESSAGE_TEST:
System.out.println("Receive a test Message!");
Toast.makeText(HandlerTestActivity.this,
"Receive a test Message", Toast.LENGTH_LONG).show();
}
}
};
Handler类的消息处理本质上要通过Looper对象进行处理。因为主线程默认已经初始化了一个Looper对象,在主线程上创建Handler对象时,可以使用默认的Looper对象。
当我们希望在另一个非主线程上使用Handler对象时,则需要提供一个Looper对象。Android为了方便开发,已经提供了一个HandlerThread,该类在普通线程上,创建了一个Looper对象,方便我们在一个新的线程上创建Handler对象,代码如下:
final HandlerThread testThread = new HandlerThread("test thread");
testThread.start();
testHandler = new AnotherHandler(testThread.getLooper());
AnotherThread是我们从Handler类派生的一个子类,实现了消息处理:
class AnotherHandler extends Handler {
public AnotherHandler(Looper looper) {
super(looper);
}
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MESSAGE_TEST2:
Toast.makeText(HandlerTestActivity.this,
"Receive a test2 Message", Toast.LENGTH_SHORT).show();
handler.sendEmptyMessage(MESSAGE_TEST);
}
}
}
当点击界面上的一个按键时,先发送MESSAGE_TEST2,在处理MESSAGE_TEST2时,将发送MESSAGE_TEST消息,实现了主线程与非主线程间基于消息的通信。
<pre name="code" class="java"> Button btn = (Button) findViewById(R.id.test);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
testHandler.sendEmptyMessage(MESSAGE_TEST2);
}
});