[java]
new Thread()
{
public void run()
{
.....
}
}.start();
如果在上述代碼中省略號處面創建一個Dialog的話會出現Can't create handle inside thread這樣的錯誤,所以改用下述message形式的,下述是一個開發項目中具體的例子。
[java]
private void showStatusDialogThread() {
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (status != null) {
if (status.equals(SyncStatus.Success)) {
// 更新本地保存的lastSyncTime為當前時間
UpdateLocalLastSyncTime(System.currentTimeMillis());
}
showStatusDialog(status);
mHandler.removeCallbacks(mRunnable);
}
super.handleMessage(msg);
}
};
mRunnable = new Runnable() {
@Override
public void run() {
mHandler.postDelayed(this, 100);
Message message = new Message();
mHandler.sendMessage(message);
}
};
mHandler.post(mRunnable);
}
其中
[java]
showStatusDialog(status);
是調用一個顯示Dialog的自定義的方法。
這種發送message的方式模型抽取出來就是下面的形式:
[java]
{
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//執行的具體方法,例如創建Dialog,計數等
......
super.handleMessage(msg);
}
};
mRunnable = new Runnable() {
@Override
public void run() {
//設置延遲時間間隔
mHandler.postDelayed(this, 100);
Message message = new Message();
mHandler.sendMessage(message);
}
};
mHandler.post(mRunnable);
}
然後在其他某處調用
[java]
mHandler.removeCallbacks(mRunnable);
就可取消此message的發送。
其實這裡發送message也是一種線程,相當於設置一個定時器,每隔一段時間執行某些代碼一樣。
下面是這個用法的另一個寫法
我覺的更簡單理解一些
[java]
Handler mHideHandler = new Handler();
Runnable mHideRunnable = new Runnable() {
@Override
public void run() {
mSystemUiHider.hide();
}
};
/**
* Schedules a call to hide() in [delay] milliseconds, canceling any
* previously scheduled calls.
*/
private void delayedHide(int delayMillis) {
mHideHandler.removeCallbacks(mHideRunnable);
mHideHandler.postDelayed(mHideRunnable, delayMillis);
}
只需要在主線程調用delayedHide就可以實現