2014-01-15 31 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