点击按钮我正在调用以下功能。
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 :(得分:0)
你应该不依赖sleep()作为准确的计时器。它不会在指定的时间自动唤醒并成为当前活动的线程,因为所有线程都受线程调度程序的支配这一简单事实。毫无疑问,基于给定的JVM,OS在操作系统之间会有所不同。
对于这些类型的场景,我一直依赖自定义计时器功能。所以,例如:
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中最精确的系统计时器。
有关sleep()函数不可靠性的其他信息,请参阅this documentation。
答案 1 :(得分:-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();