溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android計(jì)時(shí)器和倒計(jì)時(shí)

發(fā)布時(shí)間:2020-07-15 19:06:08 來(lái)源:網(wǎng)絡(luò) 閱讀:918 作者:楊光成 欄目:移動(dòng)開發(fā)

  • Android計(jì)時(shí)器和倒計(jì)時(shí)

  • 計(jì)時(shí)器

  1. 兩個(gè)核心類 Timer 和 TimerTask

 

1) Timer核心方法

 

Java代碼  

  1. //Schedules the specified task for execution after the specified delay.  

  2. void schedule(TimerTask task, long delay)  

  3.   

  4. //Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.  

  5. 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代碼  Android計(jì)時(shí)器和倒計(jì)時(shí)

  1. //總時(shí)長(zhǎng)  

  2. private static final long TOTAL_QUERY_MINUTES = 50;  

  3. //比如每5秒去查詢數(shù)據(jù)庫(kù)  

  4. private static final long QUERY_INTERVAL = 5 *1000;  

  5.   

  6. private static final int TIMER_SCHEDULE_CODE = 1;  

  7.   

  8. int timePassed=0;  

  9.   

  10. QueryTimerTask queryTask;  

  11.   

  12. private Timer timer;  

  13.   

  14. //顯示定時(shí)器的效果  

  15. ProgressBar statusBar;  

  16.   

  17. private Handler mHandler= new Handler(new Handler.Callback() {  

  18.   

  19.     @Override  

  20.     public boolean handleMessage(Message msg) {  

  21.         switch (msg.what) {  

  22.               

  23.             case TIMER_SCHEDULE_CODE:  

  24.                 statusBar.setProgress(timePassed);  

  25.   

  26.                 //Log.w(TAG, "timePassed : " + timePassed + " -- TOTAL_QUERY_MINUTES : " + TOTAL_QUERY_MINUTES);  

  27.                 if (timePassed>=TOTAL_QUERY_MINUTES){  

  28.                     if (timer != null)  

  29.                         timer.cancel();  

  30.   

  31.                     if (queryTask != null)  

  32.                         queryTask.cancel();  

  33.   

  34.   

  35.                     new AlertDialog.Builder(YourActivity.this).  

  36.                             setTitle("超時(shí)通知").setMessage("已超時(shí),是否繼續(xù)等待?")  

  37.                         .setPositiveButton("繼續(xù)等待"new DialogInterface.OnClickListener() {  

  38.                             public void onClick(DialogInterface dialog, int which) {  

  39.                                 reSchedule();  

  40.                             }  

  41.                         })  

  42.                         .setNegativeButton("取消任務(wù)"new DialogInterface.OnClickListener() {  

  43.                             public void onClick(DialogInterface dialog, int which) {  

  44.                                 //cancelTask();  

  45.                             }  

  46.                         }).show();  

  47.                   

  48.                 break;  

  49.               

  50.             //....  

  51.         }  

  52.   

  53.         return true;  

  54.     }  

  55. });  

  56.   

  57. void reSchedule() {  

  58.     timePassed = 0;  

  59.   

  60.     if (timer != null) {  

  61.         timer.cancel();  

  62.     }  

  63.   

  64.     if (queryTask != null) {  

  65.         queryTask.cancel();  

  66.     }  

  67.   

  68.     timer = new Timer();  

  69.     queryTask = new QueryTimerTask();  

  70.     //每一秒執(zhí)行一次,第一次有延時(shí)一秒的效果  

  71.     timer.schedule(queryTask, 10001000);  

  72. }  

  73.   

  74. //自定義task  

  75. class QueryTimerTask extends TimerTask {  

  76.     @Override  

  77.     public void run() {  

  78.   

  79.         //比如每過(guò)QUERY_INTERVAL去查詢信息  

  80.         if ((timePassed * 1000) % QUERY_INTERVAL == 0) {  

  81.             //query();  

  82.         }  

  83.   

  84.         timePassed++;  

  85.   

  86.         //通知handler去改變statusBar  

  87.         Message message = mHandler.obtainMessage();  

  88.         message.what = TIMER_SCHEDULE_CODE;  

  89.         mHandler.sendMessage(message);  

  90.     }  

  91. }  

 

 2. 倒計(jì)時(shí)

其實(shí)也可以用上面的方法實(shí)現(xiàn),

安卓額外提供了CountdownTimer類,以后再補(bǔ)充

文章來(lái)源:http://itlanbao.com/preview.aspx#1,0

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI