2014-01-15 28 views
0

我的問題可能是一個常見的要求。不幸的是,在任何地方都沒有找到適當的指南。在軟件中實現超時

我需要在Java中設置軟件超時。在我的設置中,我有一個連接到Android設備的鼠標。

基本上我的Android應用程序有兩種模式:ENGAGED和DISENGAGED。
默認情況下,應用程序駐留在DISENGAGED模式下。
該應用程序顯示了ENGAGED和DISENGAGED模式下的不同屏幕,該模式根據模式自動進行控制。
現在進入ENGAGED模式,用戶需要執行鼠標左鍵單擊。只要用戶使用鼠標,應用程序就會保持工作狀態。如果用戶在30秒內沒有使用鼠標,APP會返回到DISENGAGED模式。

在軟件中,我接收用戶執行的每次觸摸的事件,顯然,自上次觸摸以來30秒過去後,我沒有收到任何事件。因此,我需要一個合適的解決方案來回到脫離模式。

如何在軟件中實現這一點?代碼流的基本大綱應該就足夠了,不必是精確的工作代碼。我使用的信號量,任務,mutexs等舒適

回答

2

所有你需要做的是啓動一個簡單的線程等待30秒,並在檢測到鼠標移動時重置。

通常推薦實現Runnable而不是擴展Thread,因爲Java只有單繼承。下面是應該工作可運行私有類:

private static class CustomRunnable implements Runnable{ 
    @Override 
    public void run() { 
     boolean waiting = true; 

     while(waiting){ 
      try { 
       Thread.sleep(30000); 
       waiting = false; 
       // went 30 seconds with no interrupt - go to sleep mode 
      } catch (InterruptedException e) { 
       waiting = true; 
       // we were interrupted by mouse movement - restart loop 
      } 
     } 
    } 
} 

可以使用

Thread sleepThread = new Thread(new CustomRunnable()); 
sleepThread.start(); 

啓動線程,並且可以使用

sleepThread.interrupt(); 
+0

謝謝。順便說一句,如果沒有中斷和任務進入睡眠狀態,我可以直接調用'sleepThread.start()'來重新初始化定時器,還是需要執行'Thread sleepThread = new Thread(new CustomRunnable())'部分再次? – vishal

+0

對。這個更正是必要的。 – vishal

+0

我被困在一點。如果線程在正確超時後退出,我無法通過發出'sleepThread.start()'來重用它。這會發出「線程已激活」錯誤。你知道這個解決方案嗎? – vishal

0

這會不會做的伎倆: System.currentTimeInMillis() API for currentTimeMillis()

+0

由於復位線,但這好好嘗試一下幫助。 Nanotime只給我當前的系統時間。我正在尋找一種方法來在超時時觸發從ENGAGED切換到DISENGAGED切換。 – vishal

+0

好吧,無視編輯然後 – nckbrz

+0

我想我對你的代碼有多複雜感到困惑,所以我可能在這方面脫離了我的聯盟。如果你願意,發表一個例子,我可以嘗試幫助更多...祝你好運 – nckbrz