Android實(shí)現(xiàn)定時(shí)器的五種方法實(shí)例詳解
一、Timer
Timer是Android直接啟動(dòng)定時(shí)器的類,TimerTask是一個(gè)子線程,方便處理一些比較復(fù)雜耗時(shí)的功能邏輯,經(jīng)常與handler結(jié)合使用。
跟handler自身實(shí)現(xiàn)的定時(shí)器相比,Timer可以做一些復(fù)雜的處理,例如,需要對(duì)有大量對(duì)象的list進(jìn)行排序,在TimerTask中執(zhí)行不會(huì)阻塞子線程,常常與handler結(jié)合使用,在處理完復(fù)雜耗時(shí)的操作后,通過handler來(lái)更新UI界面。
timer.schedule(task, delay,period);
task: TimerTask類型的對(duì)象,實(shí)現(xiàn)TimerTask的run()方法就是要周期執(zhí)行的一個(gè)任務(wù);
delay : 從定時(shí)器初始化成功 開始啟動(dòng) 的延遲時(shí)間。
period:定時(shí)器的間隔時(shí)間。
第三個(gè)參數(shù)就是執(zhí)行的周期,為long類型。
TimerTask task= new TimerTask() { @Override public void run() { count++; Log.i("MainActivity",count + ""); } }; new Timer().shedule(task,0,1000);//
以下是幾種調(diào)度task的方法:
//time為Date類型:在指定時(shí)間執(zhí)行
timer.schedule(task, time);
//firstTime為Date類型,period為long,表示從firstTime時(shí)刻開始,每隔period毫秒執(zhí)行一次。
timer.schedule(task, firstTime,period);
//delay 為long類型:從現(xiàn)在起過delay毫秒執(zhí)行一次。
timer.schedule(task, delay);
//delay為long,period為long:從現(xiàn)在起過delay毫秒以后,每隔period毫秒執(zhí)行一次。
timer.schedule(task, delay,period);
//time為Date類型:在指定時(shí)間執(zhí)行一次。
timer.schedule(task, time);
//firstTime為Date類型,period為long,表示從firstTime時(shí)刻開始,每隔period毫秒執(zhí)行一次。
timer.schedule(task, firstTime,period);
//delay 為long類型:從現(xiàn)在起過delay毫秒執(zhí)行一次。
timer.schedule(task, delay);
//delay為long,period為long:從現(xiàn)在起過delay毫秒以后,每隔period毫秒執(zhí)行一次。
timer.schedule(task, delay,period);
注意: 1.taskonDestory()中取消掉,否則可能發(fā)生崩潰
2.用TimerTask定時(shí)進(jìn)行某些操作的APP,即使退出了,TimerTask中依然會(huì)運(yùn)行一會(huì),但是不能長(zhǎng)時(shí)間運(yùn)行
3.對(duì)于部分手機(jī),如果你在TimerTask直接更新了UI線程是不會(huì)報(bào)錯(cuò)的,而且運(yùn)行正常,但是一定注意,更新UI一定要在主線程中執(zhí)行,否則排查錯(cuò)誤的時(shí)候你懂得。而且這個(gè)東西特別耗電,特別耗電,特別耗電,重要的事情說三遍,一定在不使用的時(shí)候關(guān)閉
二 、CountDownTimer
CountDownTimer cdt = new CountDownTimer(10000, 100) { @Override public void onTick(long millisUntilFinished) { tv_hello.setText(millisUntilFinished + ""); } @Override public void onFinish() { } }; cdt.start();
onTick中的方法一次
直到執(zhí)行完10000/100次為止,最后會(huì)執(zhí)行onFinish()
三、 AlarmManager
Intent intent2 = newIntent(ReadLogService.this,TestBroadcast.class); PendingIntent pd=PendingIntent.getBroadcast(getApplicationContext(),0,intent2,PendingIntent.FLAG_ONE_SHOT); AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); long triggerTime =SystemClock.elapsedRealtime() + 5*1000; am.set(AlarmManager.ELAPSED_REALTIME,triggerTime, pd);
上面就是定時(shí)器的基本用法,先獲取manager,然后定義鬧鐘的flag,循環(huán)時(shí)間,到指定時(shí)間發(fā)出的pendingIntent。
一般都發(fā)出的pendingIntent都是廣播,我們自定義一個(gè)廣播接收器,就可以通過接收這個(gè)廣播,來(lái)處理自己的功能邏輯了。
這里需要注意在獨(dú)立進(jìn)程中配置,這是android所定義的
<receiver android:name="com.xxxx.Receiver" android:process=":remote" />
1,Alarm定時(shí)不需要程序自身去維護(hù),而又系統(tǒng)來(lái)維護(hù),使得程序更好避免了容易出錯(cuò)問題,更是占用系統(tǒng)資源,cpu占有率。
2,即使程序退出后,程序自身不會(huì)有任何煩惱的問題,系統(tǒng)到時(shí)間自動(dòng)調(diào)用對(duì)應(yīng)組件執(zhí)行定義好的邏輯
3,定時(shí)的多樣性,包括一次定時(shí),循環(huán)定時(shí)(在xx年x月x日?qǐng)?zhí)行,周一至周五執(zhí)行,每天幾點(diǎn)幾分執(zhí)行。。。)
四、 handler
Handler可以幫助我們?cè)谧泳€程中操作UI線程,例如子線程解析數(shù)據(jù),解析結(jié)束后通知UI刷新界面。他本身也可以實(shí)現(xiàn)定時(shí)器。
private Handler handler = Handler() { public handleMessage(android.os.Message msg) { switch (msg.what) { : // 移除所有的msg.what為0等消息,保證只有一個(gè)循環(huán)消息隊(duì)列再跑 handler.removeMessages(); // app的功能邏輯處理 ... // 再次發(fā)出msg,循環(huán)更新 handler.sendEmptyMessageDelayed(, ); break; : // 直接移除,定時(shí)器停止 handler.removeMessages(); break; default: break; } }; };
只要在啟動(dòng)定時(shí)器的時(shí)候,Handler.sendEmptyMessage(0),定時(shí)器就啟動(dòng)了。繼續(xù)循環(huán)和停止的方法,注釋上已經(jīng)寫了。
每次循環(huán)都是在主線程中操作,避免了子線程和主線程之間的穿插交互,個(gè)人覺得比timer好控制,功能實(shí)現(xiàn)也很簡(jiǎn)單。
個(gè)人覺得比較適用連續(xù)更新UI,不做復(fù)雜耗時(shí)的處理的情況,例如在播放器中,我們需要更新當(dāng)前播放進(jìn)度的時(shí)間的顯示,僅僅是更新了文字顯示,用handler就是個(gè)不錯(cuò)的選擇。
五、Thread
Thread實(shí)現(xiàn)定時(shí)器是創(chuàng)建一個(gè)子線程,在里面while循環(huán),可以通過handler來(lái)更新UI。個(gè)人覺得Thread和Timer沒區(qū)別,只是長(zhǎng)得不一樣。
private MyThread thread; private class MyThread extends Thread { public boolean stop; public () { while (!stop) { // 處理功能 // 通過睡眠線程來(lái)設(shè)置定時(shí)時(shí)間 { Thread.sleep(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; }; /** * 啟動(dòng)線程 * */ private start() { (thread == ) { thread = MyThread(); thread.start(); } } /** * 停止線程 * */ private () { (thread != ) { thread.stop = ; thread = ; } }
覺得跟Timer差不多,沒什么特殊優(yōu)點(diǎn)
跟Timer差不多,多線程如果考慮不周經(jīng)常會(huì)出問題,經(jīng)常會(huì)出現(xiàn)多個(gè)相同功能的線程同時(shí)存在,android本身對(duì)于子線程的使用使用數(shù)量是有限制的,而且一個(gè)app同時(shí)跑多個(gè)線程是一個(gè)很可怕的事情,所以和Timer一樣,使用的時(shí)候一定要謹(jǐn)慎考慮。
以上所述是小編給大家介紹的Android實(shí)現(xiàn)定時(shí)器的五種方法實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android使用Handler實(shí)現(xiàn)定時(shí)器與倒計(jì)時(shí)器功能
- Android定時(shí)器和倒計(jì)時(shí)實(shí)現(xiàn)淘寶秒殺功能
- 詳解Android實(shí)現(xiàn)定時(shí)器的幾種方法
- Android 定時(shí)器實(shí)現(xiàn)圖片的變換
- Android定時(shí)器Timer的停止和重啟實(shí)現(xiàn)代碼
- Android 實(shí)現(xiàn)定時(shí)器的四種方式總結(jié)及實(shí)現(xiàn)實(shí)例
- Android中使用定時(shí)器的三種方法
- Android定時(shí)器實(shí)現(xiàn)的幾種方式整理及removeCallbacks失效問題解決
- 基于Android中實(shí)現(xiàn)定時(shí)器的3種解決方法
- Android定時(shí)器實(shí)現(xiàn)定時(shí)執(zhí)行、重復(fù)執(zhí)行、定時(shí)重復(fù)執(zhí)行、定次數(shù)執(zhí)行的多種方式
相關(guān)文章
Android進(jìn)階NestedScroll嵌套滑動(dòng)機(jī)制實(shí)現(xiàn)吸頂效果詳解
這篇文章主要為大家介紹了Android進(jìn)階NestedScroll嵌套滑動(dòng)機(jī)制實(shí)現(xiàn)吸頂效果詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android車載空調(diào)系統(tǒng)(HVAC)開發(fā)方法分析
HVAC?全稱:供暖通風(fēng)與空氣調(diào)節(jié)(Heating?Ventilation?and?Air?Conditioning),用戶可以通過他來(lái)控制整個(gè)汽車的空調(diào)系統(tǒng),是汽車中非常重要的一個(gè)功能,汽車的空調(diào)HMI雖然并不復(fù)雜,但是大多都是用符號(hào)來(lái)表示功能,必須理解空調(diào)的各個(gè)符號(hào)表示的含義2023-12-12Android中TextView實(shí)現(xiàn)部分文字可點(diǎn)擊跳轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Android中TextView實(shí)現(xiàn)部分文字可點(diǎn)擊跳轉(zhuǎn)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10利用adt-bundle輕松搭建Android開發(fā)環(huán)境與Hello world(Linux)
這篇文章主要介紹了利用adt-bundle在Linux下輕松搭建Android開發(fā)環(huán)境與Hello world,感興趣的小伙伴們可以參考一下2016-07-07Android使用ViewDragHelper實(shí)現(xiàn)圖片下拽返回示例
這篇文章主要介紹了Android使用ViewDragHelper實(shí)現(xiàn)圖片下拽返回示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-08-08