[英]Run a method at a time interval
Java / Android是否有任何構造可用於在某個時間間隔內在類中運行方法?
我知道Scheduler
和Timer
類,但我需要避免實例化另一個類。 該方法不能在另一個單獨的線程中運行。 運行AsyncTask
或Handler
產生一個單獨的線程。
該方法不能在另一個單獨的線程中運行
由於這個要求你只有一個合理的解決方案,你必須在自己的線程中等待 ,如下所示:
for (int i = 0; i < 100; i++) {
long intervalInMs = 1000; // run every second
long nextRun = System.currentTimeMillis() + intervalInMs;
callAMethod();
if (nextRun > System.currentTimeMillis()) {
Thread.sleep(nextRun - System.currentTimeMillis());
}
}
請注意,如果方法調用花費的時間比您想要等待的時間長,它將不會調用兩次(因為您只有一個Thread
)您可以通過向if
編寫else
子句來檢測它,並進行一些修改(例如,增加intervalInMs
);
您需要使用AlarmManager。
檢查此SO以獲得良好的概述: Android:如何使用AlarmManager
我不會嘗試在你自己的線程中管理它,但讓Android框架為你處理這個問題。 不知道為什么你需要它在同一個線程中運行。
創建一個接收監聽器的自定義Timer,然后在您的時間結束時,將回調發送到在其線程中創建了Timer的對象。
這將為Timer創建一個新的Thread,但是你想要執行的方法將在原始的對象線程上執行
如果你真的必須在沒有阻塞的同一個線程中執行此操作,一種可能的解決方案是進行某種輪詢。 我想象代碼會定期計算自上次觸發方法以來經過的時間。 如果已配置的時間段已過,則再次觸發該方法。
這種解決方案似乎很難實現。 您多久執行一次輪詢代碼? 如何在應用程序的其余部分的邏輯中執行可能在同一時間內繼續執行的輪詢代碼? 這些只是我們想到的技術挑戰。 我確定還有其他人。 考慮到這一點,我認為更好的解決方案是重新考慮您的限制。 為什么要在同一個線程中執行此操作? 您應該仔細考慮自己的原因,並考慮使用單獨的線程(無論您是使用Timer自行滾動還是使用Android平台通過AlarmManager為您管理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.