一)Handler的定义
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case MESSAGE_SPEAK:
String utterance = (String) message.obj;
mTts.speak(utterance, QUEUING_MODE_INTERRUPT, null);
return;
...
}
或
Handler mHandler = new Handler();
二)Handler的使用
基本可以分为两种,一种是各种形式的SendMessage,一种是各种形式的post(详情可参考API)。
1)SendMessage可以用来在线程间发生消息:
mHandler.sendEmptyMessage(MESSAGE_SHUTDOWN_TTS);
或 mHandler.sendMessage(mHandler.obtainMessage(0x120,110,119,"\"Test Message Content!\""));
mHandler.obtainMessage(MESSAGE_PLAY_EARCON, INDEX_RINGER_SILENT, 0).sendToTarget();等
2)post用来在UI主线程中执行Runnable对象:
mHandler.post(new Runnable() {
public void run() {
...
mWindowManager.addView(mDialogText, lp);
}});
}
或
private Runnable mForceCheckBoxRunnable = new Runnable() {
public void run() {
if (mCheckBoxPreference != null) {
mCheckBoxPreference.setChecked(!mCheckBoxPreference.isChecked());
}
// Force toggle again in a second
mHandler.postDelayed(this, 1000);
}
};
三)内存泄漏
Handler会因隐式持有外部类的引用而引起内存泄漏,为避免内存泄漏,在使用Handler的Activity的onPause()函数中需要调用:
mHandler.removeMessages(MSG_FADE);(针对SendMessagepost)
或mHandler.removeCallbacks(mForceCheckBoxRunnable);(针对post)
四)Looper类
在非UI线程中使用Handler需要使用Looper类来自己维护消息队列。
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Looper.loop();
}
}
}, "thread1").start();
...
}
其中,Looper.prepare() 用来创建消息队列,并将该Looper与线程关联。
Looper.loop()循环读取消息并将其发生给相应的Handler
另外还有几个会用到的函数:
Looper.myLooper()返回与当前线程关联的Looper对象,在调用之前必须先调用Looper.prepare(),否则返回值是null。
Looper.quit()将消息队列中阻塞的消息抛出并回收。一般在线程结束前调用。