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 秒,之后每次点击都会降低到较低的值。

4

2 回答 2

0

应该依赖 sleep() 作为准确的计时器。它不会在指定时间自动唤醒并成为当前活动的线程,因为一个简单的事实是所有线程都受线程调度程序的支配。根据给定的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 中可用的最精确的系统计时器。

有关 sleep() 函数不可靠性的更多信息,请参阅此文档

于 2013-03-26T06:43:06.147 回答
-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();
于 2013-03-26T07:01:06.363 回答