-1

我正在创建一个让闪光灯相机闪烁的应用程序,但我在关闭该方法时遇到了问题。这些是我的变量:

Camera camera = null;
Parameters parameters;
int delay = 600;
int period = 600;
int delay1 = 300;
int period1 = 600;
Timer timer, timer2;

我用来使闪光灯相机闪烁的这种方法:

timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            cameraOn();
            }
    },delay1,period1);

    timer2 = new Timer();
    timer2.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            cameraOff();
            }
    },delay,period);

现在问题来了,有一个按钮可以关闭所有这些,但有时它可以工作,有时它不能。有时它会完美关闭,有时它会像我想要的那样回到以前的活动,但闪光灯相机保持打开状态。怎么了?以下是关闭相机闪光灯的方法:

private void cameraOff() {
     parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
     camera.setParameters(parameters);
     camera.release();
     camera = null;
}

private void cameraOn() {
     camera = Camera.open();
     parameters = camera.getParameters();
     parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
     camera.setParameters(parameters);
}

这是按钮:

@Override
public void onClick(View arg0) {
    timer.cancel();
    timer2.cancel();
    if(camera != null){
        cameraOff();
    }else{
        finish();
    }
}
4

1 回答 1

0

由于设计缺陷,您的应用程序(如提供的)永远不会工作:

cameraOff()您设置camera为的方法中null。此方法以固定间隔触发,因此下次再次调用该方法时,您将NullPointerExceptionascamera设置为null...

我不知道你为什么会有将它设置为的冲动null,但你需要在其他地方这样做,或者添加检查是否cameranull

此外(可能是您的问题的原因),它们TimerTasks是在不同的线程上执行的。当您取消计时器时, 的值camera是未知的,可能会cameraOff()被调用两次。一次来自TimerTask线程(因为它即将执行),一次来自您的主线程(因为camera尚未设置null)。

同样,我想知道为什么您需要设置cameranull,因为这似乎会导致您的大部分问题。

于 2013-01-05T10:39:30.303 回答