1

我正在使用Java executorservice在我的一個應用程序中創建超時效果。經過一段時間後,他們的執行者服務開始並將用戶從會話中註銷。但是在Android設備上,當設備進入睡眠狀態時,執行程序線程被暫停。設備喚醒後,線程未掛起。我希望更改執行程序正在使用的時鐘,以便在設備進入深度睡眠後繼續計數。有沒有辦法,我可以騎在哪個時鐘正在使用(我知道我可以換出整個實施和使用alarmmanager,但我不希望改變現有的代碼,所以請不要嘗試提供其他的API)。ExecutorService如何更改調度時鐘

我的問題是,儘管設備處於睡眠狀態,但必須有系統時鐘繼續運行,我怎樣才能讓executor scheduler使用該時鐘而不是現在使用的那個設備,它會尊重設備進入深度睡眠並暫停滴答?

我的代碼,我目前是非常簡單的,只是看起來像這樣:

myExecutorService.schedule(new EndUserSession(), 
         6L, TimeUnit.MINUTES); 

上面這段代碼開始EndUserSession()在6分鐘。它可以工作,但我想使用另一個不考慮移動設備時間的時鐘。

回答

2

我強烈懷疑可能會影響調度程序服務的計時機制。

您有另一種選擇來避免設備休眠導致的問題,例如在構造函數中傳遞特定時間戳並以固定速率安排任務。例如:

class EndSessionTask { 

    final long sessionExpirationTime; 
    volatile ScheduledFuture future; 

    public EndSessionTask(long ts) { sessionExpirationTime = ts; } 

    public void run() { 
     if (sessionExpirationTime < currentTs) return; 
     endSession(); 
     future.cancel(); 
    } 

    public void setFuture(ScheduledFuture f) { this.future = f; } 
} 

long endSessionTime = System.currentTimeMillis() + 6 * 60 * 1000; 
EndSessionTask task = new EndSessionTask(endSessionTime); 
ScheduledFuture future = executorService.scheduleAtFixedRate(task, 10L, 10L, SECONDS); 
task.setFuture(future); 
+0

您能解釋10L邏輯嗎?如果不清楚如何幫助。設備可以進入睡眠狀態,您的日程安排將凍結。當它被喚醒時,它仍然會繼續運行 – j2emanue

+0

@ j2emanue這個想法是檢查會話是否每隔10秒過期一次。如果設備睡了一個小時,喚醒後10秒內任務會觸發。它會注意到到期時間已經過去並終止會話。然後它將取消預定的任務。 – AdamSkywalker

相關問題