1. 程式人生 > 實用技巧 >轉 android開發筆記之handler+Runnable的一個巧妙應用

轉 android開發筆記之handler+Runnable的一個巧妙應用

本文連結:https://blog.csdn.net/hfreeman2008/article/details/12118817 版權

1. 一個有趣Demo:

(1)定義一個handler變數

    private final Handler mHandler = new Handler();

(2)定義一個Runnable變數

private Runnable onDoSomethingRunnable = new Runnable() {
	public void run() {
		onDoSomething();						
	}
};

(3)定義onDoSomething()方法:

public void onDoSomething(){
    ..................................
    ..................................

    mHandler.postDelayed(onDoSomethingRunnable,150);



}

大家看一下上面的程式碼,發現了什麼沒。對,這個組合,可以實現每隔一段時間,迴圈的執行某個操作。eg:每隔一秒,更新UI,每隔一段時間,去檢視一個程序或者服務是否結束,............等等.當然了,大家可能會發現,一種方式可能有點消耗資源,因為他會迴圈的執行固定的操作,所以一般還是少用。

2. 一些關於Handler的事情:

A Handler allows you to send and process Message and Runnable objects associated with athread's MessageQueue

handler的作用,我就不說了,這種機制,我的理解是將一些非主UI執行緒更新UI,傳遞一些資料等等。當然,官方的說明:

There are two main uses for a Handler: (1) to schedulemessagesandrunnablesto beexecuted as some point in the future; and (2) to enqueue anaction

to be performedon a different thread than your own.

Handler中分發訊息和runnable的一些方法:

post(Runnable),postAtTime(Runnable, long),postDelayed(Runnable, long),

sendEmptyMessage(int),sendMessage(Message),sendMessageAtTime(Message, long),sendMessageDelayed(Message, long)

Handler刪除訊息和runnable的方法:

removeCallbacks(Runnable),removeCallbacks(Runnable, Object ),removeCallbacksAndMessages(Object),

removeMessages(int), removeMessages(int , Object )

3.幾個經典的DEMO。

(1)在一段資料處理的耗時操作後,如果這個操作超過1s,就顯示進度條,如果耗時操作不超過1s,則不顯示進度條後

//Handler處理訊息
final Handler handler = new Handler();

final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage(getText(R.string.adding_recipients));
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false);

final Runnable showProgress = new Runnable() {
	public void run() {
		progressDialog.show();
	}
};

// Only show the progress dialog if we can not finish off parsing the return data in 1s,
// otherwise the dialog could flicker.
handler.postDelayed(showProgress, 1000);

new Thread(new Runnable() {
	public void run() {
	   try {
               //資料處理
           } finally {
		handler.removeCallbacks(showProgress);
		progressDialog.dismiss();
           }
	}
}).start();


(2)更新UI介面

在需要更新頁面的地方,發出更新介面的命令
private static final int UPDATE_PAGE_INDICATOR  = 1;
/****更新使用者選中的數目******/
private static final int UPDATE_SELE_COUNT  = 2;


/****更新頁面指示器******/								
Message msg = myHandler.obtainMessage();  
Bundle bundle = new Bundle();  
//bundle.putInt("page", page);
bundle.putInt("page", PageCurrent);
msg.setData(bundle);    // 向訊息中新增資料  
msg.what = UPDATE_PAGE_INDICATOR;
myHandler.sendMessage(msg);    // 向Handler傳送訊息,更新UI  


在需要更新指示選中數目的TextView的地方,發出更新介面的命令
myHandler.sendEmptyMessage(UPDATE_SELE_COUNT);	


更新介面的操作,都放在myHandler 中

/***********myHandler:更新介面***********/	
public Handler myHandler = new Handler(){
	public void handleMessage(Message msg) {
		super.handleMessage(msg);
switch(msg.what)
		{
		case  UPDATE_PAGE_INDICATOR :					
			Bundle data = msg.getData();  
			int page = (Integer) data.get("page");  					
			/*****更新頁面指示器******/
			upDatePageIndicator(page);
			break;	
		case UPDATE_SELE_COUNT:
			mySelectCount.setText(""+selectCount);
			break;
		}
	}						
};



(3).Handler 和 Runnable 控制顯示一個文字,1.5s後,讓其不顯示:

private TextView overlay = null;
LayoutInflater inflater = LayoutInflater.from(this);  	
overlay = (TextView) inflater.inflate(R.layout.overlay, null);  

private Handler <strong>handler</strong>;
handler = new Handler();

private OverlayThread <strong>overlayThread</strong>;
overlayThread = new OverlayThread();

overlay.setText(sections[position]);
overlay.setVisibility(View.VISIBLE);				
<strong>handler.removeCallbacks(overlayThread);
/*****延遲一秒後執行,讓overlay為不可見*****/
handler.postDelayed(overlayThread, 1500);</strong>


/**
* 類描述:OverlayThread:實現設定overlay不可見
*  @author hexiaoming
*  @version  
*/
private class OverlayThread implements Runnable {
    	
/** 
* 方法描述:run方法
* @param   
* @return  
* @see OverlayThread
*/
public void run() {
	overlay.setVisibility(View.GONE);
}   	
}


參考資料:

1.Android的Handler總結

http://www.cnblogs.com/dawei/archive/2011/04/09/2010259.html