2013-03-26 173 views
0

点击按钮,我正在呼叫以下功能。线程中睡眠问题

private void badButtonHandler() { 
    Camera.Parameters params = mCamera.getParameters(); 
    params.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE); 
    mCamera.setParameters(params); 
    if(thread != null){ 
     thread = null; 
    } 
    thread = new Thread() 
    { 
     @Override 
     public void run() { 
      try { 
       while(true) { 
        sleep(5000); 
        Camera.Parameters params = mCamera.getParameters(); 
        params.setColorEffect(Camera.Parameters.EFFECT_NONE); 
        mCamera.setParameters(params); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 

    thread.start(); 
} 

此功能用于在按钮单击5秒后更改相机的色彩效果。第一次按下相关按钮时,其行为与预期相同。但是对这个函数的其他调用并不像预期的那样。也就是说,第二次等待2秒钟,然后每次点击都降低到更低的值。

+0

使用标志,因为主题是当u点击按钮第一次 – 2013-03-26 05:08:34

+0

Android中后连续运行来控制线程我想,而不是使用线程它能够更好地使用处理器与postDelayed方法HTTP:/ /developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,long) – 2013-03-26 05:09:41

+0

运行第一次后可以停止吗?并再次运行.. – 2013-03-26 05:09:45

回答

0

你应该不是是依靠睡眠()作为一个准确的计时器。它不会在指定的时间自动唤醒并成为当前活动的线程,因为所有线程都受线程调度程序的支配。毫无疑问,根据给定的JVM,从操作系统到操作系统会有所不同。

我一直依靠这些类型场景的自定义计时器功能。因此,举例来说:

myTimer(System.nanoTime()); 

public static void myTimer(long startTime) { 
    while (startTime + 5000000000 > System.nanoTime()) { //Wait for 5 seconds 
     try { 
      Thread.sleep(50); //Sleep at ~50 millisecond intervals 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

你不会需要创建一个全新的主题,你在你的例子已经完成,因为Thread.sleep()方法将会把当前线程睡眠。此外,使用while(true)循环仅仅是糟糕的编程习惯。

使用nanoTime()是首选,因为它是Java中最精确的系统计时器。 ()函数的不可靠性的更多信息,请参阅this documentation

+0

睡眠可以通过使用['SystemClock.sleep(long)'](http://不会抛出'InterruptedException' – 2013-03-26 07:14:12

+0

@JustinMuller我永远不会放弃中断线程的能力,除非我有明确的理由这样做。特别是当我想要控制最终用户在设备上按下睡眠按钮时会发生什么情况* n *秒在定时器到期之前。 – 2013-03-26 07:31:49

-1

试试这个

Thread timer = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }finally{ 
       //Your desired work 
      } 
     } 
    }); 
    timer.start(); 
+0

添加finally子句并没有解决sleep()永远不能用作定时器的事实。 – 2013-03-26 07:03:31