詳解Android實(shí)現(xiàn)定時器的幾種方法
前言
這幾天正在看Android官方的開發(fā)文檔,里面有很多很值得思考的開發(fā)建議,有時間的朋友可以去看一下(官方是英文文檔,如果看不懂可以通過瀏覽器插件翻譯對比著看,還是很方便的)。
其中一篇課程提到了AlarmManager,這個類之前僅僅是了解這是一個鬧鐘的管理器,如果要是做一些勝過提醒、鬧鐘之類的軟件都需要用到。官方的例子用來實(shí)現(xiàn)定時器,突然覺得這是一個很神奇的事情,就搜集了一些資料,把我知道的實(shí)現(xiàn)計時器的幾種方法寫下來,給自己加深記憶,也分享給大家。
正文
我用到的幾種實(shí)現(xiàn)定時器的類:Handler, Timer, Thread, AlarmManager。
AlarmManager
AlarmManager是系統(tǒng)開放的鬧鐘功能,使用方式和普通的manager沒有區(qū)別。
AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
// Schedule the alarm!
Intent intent = new Intent(XXXXX);
PendingIntent sender = PendingIntent.getBroadcast(mcontext,requestCode, intent, 0);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
firstTime, 30*1000, sender);
上面就是定時器的基本用法,先獲取manager,然后定義鬧鐘的flag,循環(huán)時間,到指定時間發(fā)出的pendingIntent。
一般都發(fā)出的pendingIntent都是廣播,我們自定義一個廣播接收器,就可以通過接收這個廣播,來處理自己的功能邏輯了。
這里需要注意在獨(dú)立進(jìn)程中配置,這是android所定義的
<receiver android:name="com.xxxx.Receiver" android:process=":remote" />
優(yōu)點(diǎn)總結(jié)##
1,Alarm定時不需要程序自身去維護(hù),而又系統(tǒng)來維護(hù),使得程序更好避免了容易出錯問題,更是占用系統(tǒng)資源,cpu占有率。
2,即使程序退出后,程序自身不會有任何煩惱的問題,系統(tǒng)到時間自動調(diào)用對應(yīng)組件執(zhí)行定義好的邏輯
3,定時的多樣性,包括一次定時,循環(huán)定時(在xx年x月x日執(zhí)行,周一至周五執(zhí)行,每天幾點(diǎn)幾分執(zhí)行。。。)
適用場景##
個人覺得比較適用于獨(dú)立的功能邏輯,例如如果app需要定時從服務(wù)器抓取最新的數(shù)據(jù),使用獨(dú)立的service會與主體的功能分離、便于維護(hù),關(guān)鍵是耗電低,不易出錯。
Handler
Handler可以幫助我們在子線程中操作UI線程,例如子線程解析數(shù)據(jù),解析結(jié)束后通知UI刷新界面。他本身也可以實(shí)現(xiàn)定時器。
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
// 移除所有的msg.what為0等消息,保證只有一個循環(huán)消息隊(duì)列再跑
handler.removeMessages(0);
// app的功能邏輯處理
...
// 再次發(fā)出msg,循環(huán)更新
handler.sendEmptyMessageDelayed(0, 1000);
break;
case 1:
// 直接移除,定時器停止
handler.removeMessages(0);
break;
default:
break;
}
};
};
只要在啟動定時器的時候,Handler.sendEmptyMessage(0),定時器就啟動了。繼續(xù)循環(huán)和停止的方法,注釋上已經(jīng)寫了。
優(yōu)點(diǎn)總結(jié)##
每次循環(huán)都是在主線程中操作,避免了子線程和主線程之間的穿插交互,個人覺得比timer好控制,功能實(shí)現(xiàn)也很簡單。
適用場景##
個人覺得比較適用連續(xù)更新UI,不做復(fù)雜耗時的處理的情況,例如在播放器中,我們需要更新當(dāng)前播放進(jìn)度的時間的顯示,僅僅是更新了文字顯示,用handler就是個不錯的選擇。
Timer
Timer是Android直接啟動定時器的類,也是我最早接觸可以實(shí)現(xiàn)定時器的功能的工具類。
他的用法一般人都知道:
// 初始化定時器
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.e("lzp", "timer excute");
}
}, delay, period);
// 停止定時器
private void stopTimer(){
if(timer != null){
timer.cancle();
// 一定設(shè)置為null,否則定時器不會被回收
timer = null;
}
}
delay : 從定時器初始化成功 開始啟動 的延遲時間。
period:定時器的間隔時間。
優(yōu)點(diǎn)總結(jié)##
Timer的使用很簡單,TimerTask是一個子線程,方便處理一些比較復(fù)雜耗時的功能邏輯,經(jīng)常與handler結(jié)合使用。
適用場景
跟handler自身實(shí)現(xiàn)的定時器相比,Timer可以做一些復(fù)雜的處理,例如,需要對有大量對象的list進(jìn)行排序,在TimerTask中執(zhí)行不會阻塞子線程,常常與handler結(jié)合使用,在處理完復(fù)雜耗時的操作后,通過handler來更新UI界面。
**特別吐槽:對于部分手機(jī),如果你在TimerTask直接更新了UI線程是不會報錯的,而且運(yùn)行正常,但是一定注意,更新UI一定要在主線程中執(zhí)行,否則排查錯誤的時候你懂得。而且這個東西特別耗電,特別耗電,特別耗電,重要的事情說三遍,一定在不使用的時候關(guān)閉,慎用。
**
Thread##
Thread實(shí)現(xiàn)定時器是創(chuàng)建一個子線程,在里面while循環(huán),可以通過handler來更新UI。個人覺得Thread和Timer沒區(qū)別,只是長得不一樣。
private MyThread thread;
private class MyThread extends Thread {
public boolean stop;
public void run() {
while (!stop) {
// 處理功能
// 通過睡眠線程來設(shè)置定時時間
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
};
/**
* 啟動線程
* */
private void start() {
if (thread == null) {
thread = new MyThread();
thread.start();
}
}
/**
* 停止線程
* */
private void stop() {
if (thread != null) {
thread.stop = true;
thread = null;
}
}
優(yōu)點(diǎn)總結(jié)
覺得跟Timer差不多,沒什么特殊優(yōu)點(diǎn)
適用場景
跟Timer差不多吧 ,多線程如果考慮不周經(jīng)常會出問題,經(jīng)常會出現(xiàn)多個相同功能的線程同時存在,android本身對于子線程的使用使用數(shù)量是有限制的,而且一個app同時跑多個線程是一個很可怕的事情,所以和Timer一樣,使用的時候一定要謹(jǐn)慎考慮。
結(jié)尾
以上就是我個人使用過的定時器的幾種實(shí)現(xiàn)的方法,但是都僅僅是簡單的介紹,更為詳細(xì)的用法在網(wǎng)上有很多相關(guān)的資料,如果有錯誤,歡迎留言批評指正,希望看完這篇文章能對你有所幫助。也希望大家多多支持腳本之家。
- Android使用Handler實(shí)現(xiàn)定時器與倒計時器功能
- Android定時器和倒計時實(shí)現(xiàn)淘寶秒殺功能
- Android 定時器實(shí)現(xiàn)圖片的變換
- Android定時器Timer的停止和重啟實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)定時器的五種方法實(shí)例詳解
- Android 實(shí)現(xiàn)定時器的四種方式總結(jié)及實(shí)現(xiàn)實(shí)例
- Android中使用定時器的三種方法
- Android定時器實(shí)現(xiàn)的幾種方式整理及removeCallbacks失效問題解決
- 基于Android中實(shí)現(xiàn)定時器的3種解決方法
- Android定時器實(shí)現(xiàn)定時執(zhí)行、重復(fù)執(zhí)行、定時重復(fù)執(zhí)行、定次數(shù)執(zhí)行的多種方式
相關(guān)文章
autojs模仿QQ長按彈窗菜單實(shí)現(xiàn)示例
這篇文章主要為大家介紹了autojs模仿QQ長按彈窗菜單實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android實(shí)現(xiàn)倒計時的按鈕的示例代碼
本篇文章主要介紹了Android實(shí)現(xiàn)倒計時的按鈕的示例代碼,具有一定的參考價值,有興趣的可以了解一下。2017-01-01
Android實(shí)現(xiàn)QQ登錄界面遇到問題及解決方法
本文給大家介紹android仿qq登錄界面的實(shí)現(xiàn)代碼,在實(shí)現(xiàn)此功能過程中遇到各種問題,但是最終都順利解決,如果大家對android qq登錄界面實(shí)現(xiàn)方法感興趣的朋友一起學(xué)習(xí)吧2016-09-09
Android使用CardView作為RecyclerView的Item并實(shí)現(xiàn)拖拽和左滑刪除
這篇文章主要介紹了Android使用CardView作為RecyclerView的Item并實(shí)現(xiàn)拖拽和左滑刪除,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
Android使用ViewPager完成app引導(dǎo)頁
這篇文章主要為大家詳細(xì)介紹了Android使用ViewPager完成app引導(dǎo)頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11
Android編程實(shí)現(xiàn)ListView內(nèi)容無限循環(huán)顯示的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)ListView內(nèi)容無限循環(huán)顯示的方法,通過繼承Adapter類實(shí)現(xiàn)ListView中的數(shù)據(jù)無限循環(huán)顯示功能,需要的朋友可以參考下2017-06-06

