您好,登錄后才能下訂單哦!
計(jì)時(shí)器
兩個(gè)核心類 Timer 和 TimerTask
1) Timer核心方法
Java代碼
//Schedules the specified task for execution after the specified delay.
void schedule(TimerTask task, long delay)
//Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.
void schedule(TimerTask task, long delay, long period)
第一個(gè)方法只執(zhí)行一次;
第二個(gè)方式每隔period執(zhí)行一次,delay表示每次執(zhí)行的延時(shí)時(shí)間,其實(shí)主要表現(xiàn)在第一次的延時(shí)效果,比如delay設(shè)置為0,那么立馬執(zhí)行task內(nèi)容,如果設(shè)置為1000,那么第一次執(zhí)行task會(huì)有一秒的延時(shí)效果。
2) TimerTask用于繼承(或者直接定義并初始化匿名類),并重寫run方法,定義自己的業(yè)務(wù)邏輯。
3) 手動(dòng)結(jié)束定時(shí)器,
Timer和TimerTask都有cancel方法,而且最好同時(shí)調(diào)用;
如果已經(jīng)cancel,下次必須創(chuàng)建新的Timer才能schedule。
4) 如果你在當(dāng)前的activity中schedule了一個(gè)task,但是沒有等到task結(jié)束,就按Back鍵finish了當(dāng)前的activity,Timer和TimerTask并不會(huì)自動(dòng)cancel或者銷毀,它還會(huì)在后臺(tái)運(yùn)行,此時(shí)如果你在task的某個(gè)階段要調(diào)起一個(gè)控件(比如AlertDialog),而該控制依賴被銷毀的activity,那么將會(huì)引發(fā)crash。
5) 例如對(duì)進(jìn)度條實(shí)現(xiàn)每一秒遞增的效果(主要代碼)
Java代碼
//總時(shí)長(zhǎng)
private static final long TOTAL_QUERY_MINUTES = 50;
//比如每5秒去查詢數(shù)據(jù)庫(kù)
private static final long QUERY_INTERVAL = 5 *1000;
private static final int TIMER_SCHEDULE_CODE = 1;
int timePassed=0;
QueryTimerTask queryTask;
private Timer timer;
//顯示定時(shí)器的效果
ProgressBar statusBar;
private Handler mHandler= new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case TIMER_SCHEDULE_CODE:
statusBar.setProgress(timePassed);
//Log.w(TAG, "timePassed : " + timePassed + " -- TOTAL_QUERY_MINUTES : " + TOTAL_QUERY_MINUTES);
if (timePassed>=TOTAL_QUERY_MINUTES){
if (timer != null)
timer.cancel();
if (queryTask != null)
queryTask.cancel();
new AlertDialog.Builder(YourActivity.this).
setTitle("超時(shí)通知").setMessage("已超時(shí),是否繼續(xù)等待?")
.setPositiveButton("繼續(xù)等待", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
reSchedule();
}
})
.setNegativeButton("取消任務(wù)", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//cancelTask();
}
}).show();
break;
//....
}
return true;
}
});
void reSchedule() {
timePassed = 0;
if (timer != null) {
timer.cancel();
}
if (queryTask != null) {
queryTask.cancel();
}
timer = new Timer();
queryTask = new QueryTimerTask();
//每一秒執(zhí)行一次,第一次有延時(shí)一秒的效果
timer.schedule(queryTask, 1000, 1000);
}
//自定義task
class QueryTimerTask extends TimerTask {
@Override
public void run() {
//比如每過(guò)QUERY_INTERVAL去查詢信息
if ((timePassed * 1000) % QUERY_INTERVAL == 0) {
//query();
}
timePassed++;
//通知handler去改變statusBar
Message message = mHandler.obtainMessage();
message.what = TIMER_SCHEDULE_CODE;
mHandler.sendMessage(message);
}
}
2. 倒計(jì)時(shí)
其實(shí)也可以用上面的方法實(shí)現(xiàn),
安卓額外提供了CountdownTimer類,以后再補(bǔ)充
文章來(lái)源:http://itlanbao.com/preview.aspx#1,0
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。