在Android中,我們可以處理Message,這個Message我們可以立即執行也可以delay 一定時間執行。Handler線程在執行完所有的Message訊息,它會wait,進行阻塞,知道有心的Message到達。如果這樣子,那麼這個線程也太浪費了。MessageQueue提供了另一類訊息,IdleHandler。
IdleHandler在Handler空閑時執行,下面來看案例代碼:
MainActivity.java
package com.example.testhandler;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Looper;import android.os.Message;import android.os.MessageQueue;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private Handler mHandler;private int mWhat = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {Log.d(hlwang, 我在執行,你想回來,我用平底鍋打飛你!);try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}super.handleMessage(msg);}};Button btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {for(int i=0;i<10;i++){mHandler.sendEmptyMessage(mWhat);}}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overrideprotected void onResume() {super.onResume();Looper.myQueue().addIdleHandler(new MyIdleOnce());Looper.myQueue().addIdleHandler(new MyIdleKeep());}class MyIdleKeep implements MessageQueue.IdleHandler{/** *傳回值為true,則保持此Idle一直在Handler中,否則,執行一次後就從Handler線程中remove掉。 */@Overridepublic boolean queueIdle() {Log.d(hlwang,我是空閑線程,我還會回來的!);return true;}}class MyIdleOnce implements MessageQueue.IdleHandler{@Overridepublic boolean queueIdle() {Log.d(hlwang,我是初戀,我只在你的生命中出現一次,我發誓,你會想我的!);return false;}}}
此Activity有兩個IdleHandler訊息,我們執行此Activity時,MyIdleKeep訊息和MyIdleOnce會依次執行。如果IdleHandler的queueIdle方法返回false,那麼IdleHandler執行完,就會從IdleHandler移除。
Log輸出如下:
03-10 10:11:29.556: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:29.556: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:29.556: D/hlwang(21985): 我是初戀,我只在你的生命中出現一次,我發誓,你會想我的!03-10 10:11:29.556: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:29.576: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:29.576: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:29.576: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:30.396: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:30.396: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:30.396: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:32.276: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:32.276: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:32.276: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:32.326: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:34.386: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:36.396: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:38.386: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:40.396: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:42.386: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:44.396: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:46.436: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:48.436: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:50.446: D/hlwang(21985): 我在執行,你想回來,我用平底鍋打飛你!03-10 10:11:52.696: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:52.696: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:52.696: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:52.796: D/hlwang(21985): 我是空閑線程,我還會回來的!03-10 10:11:52.796: D/hlwang(21985): 我是空閑線程,我還會回來的!