當前位置:首頁 » 安卓系統 » android定時器timer

android定時器timer

發布時間: 2023-08-05 21:55:20

① Android定時器AlarmManager

AlarmManager是Android的全局定時器。就是在指定時間做一個事情(封裝在PendingIntent)。通過PendingIntent的getActivity()、getService()或getBroadcast()來執行。
聽起來AlarmManager和Timer很類似,但是Timer有可能因為手機休眠而被殺掉服務,但是AlarmManager可以做到喚醒手機。

註:ALARM_SERVIC是context的一個常量。

以上絕對時間就是手機的時間,相對時間是相對於當前開機時間來說。例如如果是絕對時間,那麼你測試可以通過修改系統時間來提前觸發。而相對時間的使用場景是強調多久之後觸發,例如2小時後,這個時候把時間修改到2小時後也是沒用的。
註:以前還有一個POWER_OFF_WAKEUP,即使在關機後還能提醒,但是Android4.0以後就沒有了。

該方法用於設置一次性鬧鍾。第一個參數是鬧鍾類型,第二個參數是觸發時間,第三個參數是動作。

和set一樣,但是時間更精準。

重復鬧鍾,第1、2、4個參數同上,第3個參數是兩次鬧鍾的時間間隔。

和setInexactRepeating一樣,但是時間更精準。

以上四個方法時間精不精準的原因還沒有深入研究,大概是是否允許系統同時發出多個提醒,意義在於系統喚醒cpu後會把時間接近的alarm同時發出,避免重復喚醒cpu,減少電量。

取消鬧鍾。

目的:在指定時間從一個發送個廣播,收到廣播後列印log。界面如下面這樣。

布局:

廣播接收器:

MainActivity

AndroidManifest要注冊一下receiver

經過測試,以上的時間間隔intervalMillis即使設置5秒也是沒用的,因為誤差(幾十秒呢)無法避免,即使是setRepeating。所以精確是相對的。

② android定時器alarmmanager和timer的區別

java的Timer類可以用來計劃需要循環執行的任務。
簡單的說,一個Timer內部封裝裝了「一個Thread」和「一個TimerTask隊列」,這個隊列按照一定的方式將任務排隊處理。封裝的Thread在Timer的構造方法調用時被啟動,這個Thread的run方法按照條件去循環這個TimerTask隊列,然後調用TimerTask的run方法。

但是,如果CPU進入了休眠狀態,那麼這個thread將會因為失去CPU時間片而阻塞,從而造成我們需要的定時任務失效。上述定時任務失效的場景分析:假設定時任務的條件是到了時間xx:yy才能執行,但由於cpu休眠造成線程阻塞的關系,當前系統時間超過了這個時間,即便CPU從終端中恢復了,那麼由於條件不滿足,定時任務在這一次自然就失效了。

它需要用WakeLock讓CPU 保持喚醒狀態。這樣會大量消耗手機電量,大大減短手機待機時間。這種方式不能滿足需求。

AlarmManager是Android 系統封裝的用於管理RTC的模塊,RTC(Real Time Clock) 是一個獨立的硬體時鍾,可以在 CPU 休眠時正常運行,在預設的時間到達時,通過中斷喚醒CPU。這意味著,如果我們用 AlarmManager 來定時執行任務,CPU 可以正常的休眠,只有在需要運行任務時醒來一段很短的時間。

③ Android 定時器Timer的使用

在我們Android客戶端上有時候可能有些任務不是當時就執行,而是過了一個規定的時間在執行此次任務。那麼這個時候定時顫慧器的作用就非常有用了。首先開啟一個簡單的定時器

現在我就相當於定義了拆腔一個定時器,我現在的定時器是向伺服器發送Post請求來返回數據刷新到我的界面上那麼接下來就是開啟定時器了。開啟定時器那就非常簡單了

開啟定時器特別簡單基本上一句話就搞定了
開啟定時器需要三個參數
1.就是上面所寫的你要做的事情 ,上面我寫的上向網路發送請求那麼這里就時開啟定時器請求網路
2.這個參數是你要多長時間後執行這個定時器,這里我寫的是0,那麼就是0秒後執行我的定時器。
3.這個是最重要的這就是你每次執行時間的間隔 我這里就是說每10秒向網路發送一次請求如果寫成1000就是每一秒向網路發送一次請求

如果第三個參數不寫的話那麼定時器就是幾秒後執行 那麼定時器只執行一次就不在執行了

其實定時器如果不銷毀的話是一直執行的但其實定時器如果一直執行的話那麼我們的程序根本就撐不了多長時間就會崩潰所以說定時器用完就要及時的關閉
定時器的開啟在寫Fragment或者Activity的時候我一般會寫在onStart裡面
如果銷毀的時候會寫在onStop裡面銷毀定時器也非常簡單

基本上這一句話就搞定了執行這句話說明是注銷定時器
當我們離開本界面的時候就執行這句話那麼定時器就不會在執行了當我們進入本界面在onStart執行定時器那麼就又開啟了定時器所以說這樣就寫了一個簡易版的定時器

一個簡單的定時器請求網路就完成了 HttpHolder holder = new HttpHolder(handler); 這是自己寫的網路請旅洞衫求類直接調用輸入url的伺服器地址獲得的就是伺服器發來的JSON格式的數據
在onStop裡面注銷定時器那麼每次離開本界面的時候那麼定時候就銷毀了再回到本界面的時候那麼就執行onStart裡面的開啟定時器那麼定時器就開啟了所以這樣就避免了因為定時器開啟而使程序崩潰

④ android用timer做定時任務,崩潰的原因

在做定時任務的時候,有的同學可能能會用到Timer這個定時任務的輔助類,
但是使用它會有潛在的風險,風險如下,
(1)時間計算不準確問題
因為Timer是以絕對時間計算定時任務的,會受到系統時間的影響,如果在任務執行期間,更改了系統時間,那麼會
導致時間計算不準確問題,導致任務沒用按找預定的時間執行。
(2)只能單任務執行
簡單講就是,只能一次執行一個任務,如果前一個任務沒有執行完成,後一個任務是無法並行執行的,只能等待前一個任務執行完成
才能執行。也有可能會出現這樣的結果,前一個任務執行的時間太長,後幾個任務時間短,可能在一個時間段內執行了多個任務,任務又
沒有按照我們要執行的時間執行。
(3)非檢查異常導致非同步任務終止
Timer當在執行的過程中遇到非檢查異常的時候,會導致本次任務失敗,並且接下來的任務也無法被執行,Timer將會終止執行,這不是
我們要的結果,我們需要一套恢復機制。

Java5以後可以用下面的這個類來替代Time,並且解決了以上三個問題
java.util.concurrent.ScheledThreadPoolExecutor

那麼在Android上呢,可以用 java.util.concurrent.ScheledThreadPoolExecutor,也可以用Handler機製做,
但是不建議使用Timer

⑤ android 計時器代碼

Timer mTimer = new Timer();
mTask = new TimerTask(){
public void run(){
//execute the task
Message message = new Message();
message.what = DIALOG_HIDE;
//Log.e(TAG, "message.what = DIALOG_HIDE");
mHandler.sendMessage(message);
}
};
mTimer.schele(mTask, 5000);
在主線程里開啟timer,等於啟動了另一個線程,線程之間的通信是要用handler發送message,然後在主線程里用handler.handleMessage()裡面接收並處理。

⑥ android定時器的使用

  目前在項目中使用過的定時器主要是兩種方式:1.handler的延時任務 2.timer的定時器

  下面主要來介紹這兩種方式 定時器的用法,和遇到的坑 :
  1.handler的延時任務
  寫了一個demo,是關於hanlder發送延時消息和 取消延時消息的

  但是在實際運用的過程中,常常會出現無法移除延時消息的問題,這個問題主要是因為兩個runnable的對象不是同一個,
  當Activity進入後台運行後再轉入前台運行,removeCallbacks無法將updateThread從message queue中移除。這是為什麼呢?
  在Activity由前台轉後台過程中,線程是一直在運行的,但是當Activity轉入前台時會重新定義Runnable runnable;也就是說此時從message queue移除的runnable與原先加入message queue中的runnable並非是同一個對象。  解決方式1:如果把runnable定義為靜態的則removeCallbacks不會失效,對於靜態變數在內存中只有一個拷貝(節省內存),JVM只為靜態分配一次內存,在載入類的過程中完成靜態變數的內存分配,我們做如下修改就能解決上面的這個問題.

  解決方式2:將所有的runnable任務放到一個集合中,根據runnable的id移除相應的任務,即可以解決這個問題

2.timer的延時任務
同樣用上面的demo來說明使用方法:
要注意的是:
TimerTask運行在一個單獨的線程里,而不是UI線程。所以使用 Android timer時,注意android的單線程原則,確保線程安全。不要在TimerTask的run方法中做UI相關的操作,如:TextView.setText()等,這樣可能會導致UI線程阻塞。如果需要可以使用handler向UI線程發消息,具體處理由UI線程自己完成。在使用完Timer之後,要使用Timer的cancel方法取消Timer,否則Timer一直在運行。

  這里需要注意的是,timer的cancel方法只能執行一次,不能在調用了cancel之後再進行timer的任務執行。

參考文章:
Android 定時器實現的幾種方式和removeCallbacks失效問題詳解

Android 中Timer和TimeTask完成定時任務

熱點內容
硬碟存儲伺服器怎麼連接 發布:2025-02-04 10:00:55 瀏覽:26
javaip埠 發布:2025-02-04 09:27:09 瀏覽:855
國產存儲科技進步二等獎 發布:2025-02-04 09:13:00 瀏覽:693
編程課v 發布:2025-02-04 08:45:00 瀏覽:108
模擬器能有手機腳本么 發布:2025-02-04 08:39:50 瀏覽:759
android顯示html圖片 發布:2025-02-04 08:35:31 瀏覽:793
如何查學信網賬號及密碼 發布:2025-02-04 08:33:55 瀏覽:504
linux32位jdk 發布:2025-02-04 08:33:55 瀏覽:249
康佳伺服器連接失敗是怎麼回事 發布:2025-02-04 08:18:51 瀏覽:918
編譯編譯有什麼 發布:2025-02-04 08:05:52 瀏覽:737