您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Android實現定時器的方法有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
正文
我用到的幾種實現定時器的類:Handler, Timer, Thread, AlarmManager。
AlarmManager
AlarmManager是系統開放的鬧鐘功能,使用方式和普通的manager沒有區別。
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,循環時間,到指定時間發出的pendingIntent。
一般都發出的pendingIntent都是廣播,我們自定義一個廣播接收器,就可以通過接收這個廣播,來處理自己的功能邏輯了。
這里需要注意在獨立進程中配置,這是android所定義的
<receiver android:name="com.xxxx.Receiver" android:process=":remote" />
優點總結##
1,Alarm定時不需要程序自身去維護,而又系統來維護,使得程序更好避免了容易出錯問題,更是占用系統資源,cpu占有率。
2,即使程序退出后,程序自身不會有任何煩惱的問題,系統到時間自動調用對應組件執行定義好的邏輯
3,定時的多樣性,包括一次定時,循環定時(在xx年x月x日執行,周一至周五執行,每天幾點幾分執行。。。)
適用場景##
個人覺得比較適用于獨立的功能邏輯,例如如果app需要定時從服務器抓取最新的數據,使用獨立的service會與主體的功能分離、便于維護,關鍵是耗電低,不易出錯。
Handler
Handler可以幫助我們在子線程中操作UI線程,例如子線程解析數據,解析結束后通知UI刷新界面。他本身也可以實現定時器。
private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0: // 移除所有的msg.what為0等消息,保證只有一個循環消息隊列再跑 handler.removeMessages(0); // app的功能邏輯處理 ... // 再次發出msg,循環更新 handler.sendEmptyMessageDelayed(0, 1000); break; case 1: // 直接移除,定時器停止 handler.removeMessages(0); break; default: break; } }; };
只要在啟動定時器的時候,Handler.sendEmptyMessage(0),定時器就啟動了。繼續循環和停止的方法,注釋上已經寫了。
優點總結##
每次循環都是在主線程中操作,避免了子線程和主線程之間的穿插交互,個人覺得比timer好控制,功能實現也很簡單。
適用場景##
個人覺得比較適用連續更新UI,不做復雜耗時的處理的情況,例如在播放器中,我們需要更新當前播放進度的時間的顯示,僅僅是更新了文字顯示,用handler就是個不錯的選擇。
Timer
Timer是Android直接啟動定時器的類,也是我最早接觸可以實現定時器的功能的工具類。
他的用法一般人都知道:
// 初始化定時器 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(); // 一定設置為null,否則定時器不會被回收 timer = null; } }
delay : 從定時器初始化成功 開始啟動 的延遲時間。
period:定時器的間隔時間。
優點總結##
Timer的使用很簡單,TimerTask是一個子線程,方便處理一些比較復雜耗時的功能邏輯,經常與handler結合使用。
適用場景
跟handler自身實現的定時器相比,Timer可以做一些復雜的處理,例如,需要對有大量對象的list進行排序,在TimerTask中執行不會阻塞子線程,常常與handler結合使用,在處理完復雜耗時的操作后,通過handler來更新UI界面。
**特別吐槽:對于部分手機,如果你在TimerTask直接更新了UI線程是不會報錯的,而且運行正常,但是一定注意,更新UI一定要在主線程中執行,否則排查錯誤的時候你懂得。而且這個東西特別耗電,特別耗電,特別耗電,重要的事情說三遍,一定在不使用的時候關閉,慎用。
**
Thread##
Thread實現定時器是創建一個子線程,在里面while循環,可以通過handler來更新UI。個人覺得Thread和Timer沒區別,只是長得不一樣。
private MyThread thread; private class MyThread extends Thread { public boolean stop; public void run() { while (!stop) { // 處理功能 // 通過睡眠線程來設置定時時間 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; } }
優點總結
覺得跟Timer差不多,沒什么特殊優點
適用場景
跟Timer差不多吧 ,多線程如果考慮不周經常會出問題,經常會出現多個相同功能的線程同時存在,android本身對于子線程的使用使用數量是有限制的,而且一個app同時跑多個線程是一個很可怕的事情,所以和Timer一樣,使用的時候一定要謹慎考慮。
關于“Android實現定時器的方法有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。