Handler後臺空閑線程IdleHandler

 

在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;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		mHandler = new Handler(){

			@Override
			public 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() {
			
			@Override
			public void onClick(View v) {
				for(int i=0;i<10;i++){
					mHandler.sendEmptyMessage(mWhat);
				}
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	protected void onResume() {
		super.onResume();
		
		Looper.myQueue().addIdleHandler(new MyIdleOnce());
		Looper.myQueue().addIdleHandler(new MyIdleKeep());
		
	}
	
	class MyIdleKeep implements MessageQueue.IdleHandler{
		/**
		 *返回值為true,則保持此Idle一直在Handler中,否則,執行一次後就從Handler線程中remove掉。
		 */
		@Override
		public boolean queueIdle() {
			Log.d(hlwang,我是空閑線程,我還會回來的!);
			return true;
		}
		
	}

	class MyIdleOnce implements MessageQueue.IdleHandler{

		@Override
		public 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): 我是空閑線程,我還會回來的!

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *