首先,大家在開發的時候,有時候做一些耗時任務時,難免會用到線程【Thread】,以免阻塞主線程。但是,有時候,我們只希望這個在線程里面執行的任務,不能太長,意思就是說,我需要在這個線程執行一段時間后,無論有沒有完成我制定的任務,都要講線程終止掉。這個時候又要用到【Timer】了。
變量聲明:
private static final int TIME_LIMIT = 15000; // 登陸超時時間 15秒
Timer timer;
Thread thread;
final Handler myHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case TIME_OUT:
// 打斷線程
thread.interrupt();
if (dialog != null) {
dialog.dismiss();
}
// deal with what you should do after thread job is failed
break;
case SUCCESS:
// 取消定時器
if (timer != null) {
timer.cancel();
}
if (dialog != null) {
dialog.dismiss();
}
// do what you want after thread job is successed
break;
default:
break;
}
}
};
具體方法:
timer = new Timer();
thread = new Thread(new Runnable() {
@Override
public void run() {
if(doYourJob())
//after work is done...
Looper.prepare();
sendSuccessMsg();
Looper.loop();
} else {
//work is fail
errorDialog( "sorry work is not done !");
}
}
});
thread.start();
// 設定定時器
timer.schedule(new TimerTask() {
@Override
public void run() {
sendTimeOutMsg();
}
}, TIME_LIMIT);
補充:
/**
* 錯誤對話框
*
* @param errorText
*/
private void errorDialog(String errorText) {
if (dialog != null) {
dialog.dismiss();
}
AlertDialog.Builder builder = new AlertDialog.Builder(this); // 先得到構造器
builder.setTitle("提示"); // 設置標題
builder.setMessage(errorText); // 設置內容
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { // 設置確定按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); // 關閉dialog
}
});
// 參數都設置完成了,創建并顯示出來
builder.create().show();
}
/**
* // 向handler發送超時信息
*/
private void sendTimeOutMsg() {
Message timeOutMsg = new Message();
timeOutMsg.what = TIME_OUT;
myHandler.sendMessage(timeOutMsg);
}
/**
* // 向handler成功信息
*/
private void sendSuccessMsg() {
Message timeOutMsg = new Message();
timeOutMsg.what = SUCCESS;
myHandler.sendMessage(timeOutMsg);
}