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

首頁 > 系統 > Android > 正文

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

2019-12-12 03:34:39
字體:
來源:轉載
供稿:網友

一、Timer

Timer是Android直接啟動定時器的類,TimerTask是一個子線程,方便處理一些比較復雜耗時的功能邏輯,經常與handler結合使用。

跟handler自身實現的定時器相比,Timer可以做一些復雜的處理,例如,需要對有大量對象的list進行排序,在TimerTask中執行不會阻塞子線程,常常與handler結合使用,在處理完復雜耗時的操作后,通過handler來更新UI界面。

timer.schedule(task, delay,period);

task: TimerTask類型的對象,實現TimerTask的run()方法就是要周期執行的一個任務;

delay : 從定時器初始化成功 開始啟動 的延遲時間。

period:定時器的間隔時間。

第三個參數就是執行的周期,為long類型。

TimerTask task= new TimerTask() {   @Override   public void run() {    count++;    Log.i("MainActivity",count + "");   }};new Timer().shedule(task,0,1000);//

以下是幾種調度task的方法:

//time為Date類型:在指定時間執行
timer.schedule(task, time);
//firstTime為Date類型,period為long,表示從firstTime時刻開始,每隔period毫秒執行一次。
timer.schedule(task, firstTime,period);
//delay 為long類型:從現在起過delay毫秒執行一次。
timer.schedule(task, delay);
//delay為long,period為long:從現在起過delay毫秒以后,每隔period毫秒執行一次。
timer.schedule(task, delay,period);
//time為Date類型:在指定時間執行一次。
timer.schedule(task, time);
//firstTime為Date類型,period為long,表示從firstTime時刻開始,每隔period毫秒執行一次。
timer.schedule(task, firstTime,period);
//delay 為long類型:從現在起過delay毫秒執行一次。
timer.schedule(task, delay);
//delay為long,period為long:從現在起過delay毫秒以后,每隔period毫秒執行一次。
timer.schedule(task, delay,period);

注意: 1.taskonDestory()中取消掉,否則可能發生崩潰

2.用TimerTask定時進行某些操作的APP,即使退出了,TimerTask中依然會運行一會,但是不能長時間運行

3.對于部分手機,如果你在TimerTask直接更新了UI線程是不會報錯的,而且運行正常,但是一定注意,更新UI一定要在主線程中執行,否則排查錯誤的時候你懂得。而且這個東西特別耗電,特別耗電,特別耗電,重要的事情說三遍,一定在不使用的時候關閉

二 、CountDownTimer

CountDownTimer cdt = new CountDownTimer(10000, 100) { @Override public void onTick(long millisUntilFinished) {  tv_hello.setText(millisUntilFinished + ""); } @Override public void onFinish() { }};cdt.start();

onTick中的方法一次

直到執行完10000/100次為止,最后會執行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);

上面就是定時器的基本用法,先獲取manager,然后定義鬧鐘的flag,循環時間,到指定時間發出的pendingIntent。

一般都發出的pendingIntent都是廣播,我們自定義一個廣播接收器,就可以通過接收這個廣播,來處理自己的功能邏輯了。

這里需要注意在獨立進程中配置,這是android所定義的

<receiver android:name="com.xxxx.Receiver" android:process=":remote" />

1,Alarm定時不需要程序自身去維護,而又系統來維護,使得程序更好避免了容易出錯問題,更是占用系統資源,cpu占有率。

2,即使程序退出后,程序自身不會有任何煩惱的問題,系統到時間自動調用對應組件執行定義好的邏輯

3,定時的多樣性,包括一次定時,循環定時(在xx年x月x日執行,周一至周五執行,每天幾點幾分執行。。。)

四、 handler

Handler可以幫助我們在子線程中操作UI線程,例如子線程解析數據,解析結束后通知UI刷新界面。他本身也可以實現定時器。

private Handler handler = Handler() {  public handleMessage(android.os.Message msg) {   switch (msg.what) {    :    // 移除所有的msg.what為0等消息,保證只有一個循環消息隊列再跑    handler.removeMessages();    // app的功能邏輯處理    ...    // 再次發出msg,循環更新    handler.sendEmptyMessageDelayed(, );    break;    :    // 直接移除,定時器停止    handler.removeMessages();    break;   default:    break;   }  }; };

只要在啟動定時器的時候,Handler.sendEmptyMessage(0),定時器就啟動了。繼續循環和停止的方法,注釋上已經寫了。

每次循環都是在主線程中操作,避免了子線程和主線程之間的穿插交互,個人覺得比timer好控制,功能實現也很簡單。

個人覺得比較適用連續更新UI,不做復雜耗時的處理的情況,例如在播放器中,我們需要更新當前播放進度的時間的顯示,僅僅是更新了文字顯示,用handler就是個不錯的選擇。

五、Thread

Thread實現定時器是創建一個子線程,在里面while循環,可以通過handler來更新UI。個人覺得Thread和Timer沒區別,只是長得不一樣。

private MyThread thread;private class MyThread extends Thread { public boolean stop; public () {  while (!stop) {   // 處理功能   // 通過睡眠線程來設置定時時間    {    Thread.sleep();   } catch (InterruptedException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  } };};/** * 啟動線程 * */private start() {  (thread == ) {  thread = MyThread();  thread.start(); }}/** * 停止線程 * */private () {  (thread != ) {  thread.stop = ;  thread = ; }}

覺得跟Timer差不多,沒什么特殊優點

跟Timer差不多,多線程如果考慮不周經常會出問題,經常會出現多個相同功能的線程同時存在,android本身對于子線程的使用使用數量是有限制的,而且一個app同時跑多個線程是一個很可怕的事情,所以和Timer一樣,使用的時候一定要謹慎考慮。

以上所述是小編給大家介紹的Android實現定時器的五種方法實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝阳县| 山阴县| 工布江达县| 鱼台县| 重庆市| 元阳县| 呼玛县| 隆子县| 梧州市| 襄樊市| 滦平县| 孝昌县| 兴山县| 宜城市| 萝北县| 江都市| 南安市| 双鸭山市| 酒泉市| 清远市| 博爱县| 太谷县| 连云港市| 肇庆市| 沙湾县| 武宁县| 通江县| 西乌珠穆沁旗| 绥阳县| 杭州市| 抚顺县| 开鲁县| 腾冲县| 云龙县| 汤阴县| 南宫市| 六安市| 佳木斯市| 商水县| 大余县| 金堂县|