国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解Android實現定時器的幾種方法

2019-10-22 18:27:54
字體:
來源:轉載
供稿:網友

前言

這幾天正在看Android官方的開發文檔,里面有很多很值得思考的開發建議,有時間的朋友可以去看一下(官方是英文文檔,如果看不懂可以通過瀏覽器插件翻譯對比著看,還是很方便的)。

其中一篇課程提到了AlarmManager,這個類之前僅僅是了解這是一個鬧鐘的管理器,如果要是做一些勝過提醒、鬧鐘之類的軟件都需要用到。官方的例子用來實現定時器,突然覺得這是一個很神奇的事情,就搜集了一些資料,把我知道的實現計時器的幾種方法寫下來,給自己加深記憶,也分享給大家。

正文

我用到的幾種實現定時器的類: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一樣,使用的時候一定要謹慎考慮。

結尾

以上就是我個人使用過的定時器的幾種實現的方法,但是都僅僅是簡單的介紹,更為詳細的用法在網上有很多相關的資料,如果有錯誤,歡迎留言批評指正,希望看完這篇文章能對你有所幫助。也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 察隅县| 新昌县| 綦江县| 栾城县| 江阴市| 保定市| 麟游县| 平塘县| 恩施市| 枣阳市| 墨玉县| 安西县| 南澳县| 密山市| 大荔县| 蛟河市| 皋兰县| 白山市| 涡阳县| 同心县| 宁都县| 河源市| 勐海县| 山东| 西乌珠穆沁旗| 翼城县| 孟津县| 涟源市| 扶沟县| 界首市| 安泽县| 乡城县| 高唐县| 怀宁县| 伊宁县| 清河县| 三河市| 定兴县| 夏河县| 揭阳市| 安吉县|