0

我的相机应用程序中有 Multi-Shot 功能。我正在使用以下短代码来做到这一点。

if (TIMER_STARTED) {
    multishotTimer.cancel();
    multishotTimer.purge();
    multishotTimer = null;
    TIMER_STARTED = false;
} else {
    multishotTimer = new Timer();
    multishotTimer.schedule(new TimerTask() {

        @Override
        public void run() {
            TIMER_STARTED = true;
            Camera camera = surfaceView.getCamera();
            camera.takePicture(null, null,
                    new HandlePictureStorage());
        }
    }, 1000, 5000L);
}

这里,TIMER_STARTED是布尔标志,指示定时器是否启动。HandlePictureStorage是处理PictureCallback的类。

问题: 当我第一次点击“MultiShot”按钮时,它会启动计时器并每 5 秒拍照一次。要停止计时器,我再单击一次相同的按钮。但是,如果我连续单击按钮,应用程序会挂起并强制停止。然后在我需要关闭我的设备后,由于停止的服务使用了相机并且不能轻易释放它。如何管理启动和停止计时器?

4

2 回答 2

1

您不需要 TIMER_STARTED 来选择按钮是启动还是停止连拍:您只需检查if (multishotTimer != null).

但即使在此修复之后,单击太快也可能是危险的:您不应该在takePicture和之间创建新的 Timer HandlePictureStorage

private bool isCapturing = false;

@Override
public void onClick(View v) {
    if (multishotTimer != null) {
        multishotTimer.cancel();
        multishotTimer.purge();
        multishotTimer = null;
    }
    else if (!isCaptureing) {
        multishotTimer = new Timer();
        multishotTimer.schedule(new TimerTask() {

            @Override
            public void run() {
                isCapturing = true;
                Camera camera = surfaceView.getCamera();
                camera.takePicture(null, null,
                    new HandlePictureStorage());
            }
        }, 1000, 5000L);
    }
}

class HandlePictureStorage implements ... {
    @Override
    public void onPictureTaken(...) {
        isCaptureing = false;
    }
}
于 2013-06-04T20:12:51.703 回答
0

您需要TIMER_STARTED = true;从计时器任务转移到else部件,例如在安排计时器之后。

为了提高性能,您应该在TimerTask每次创建和启动计时器时创建一个字段,而不是重新创建一个匿名类。

于 2013-06-04T15:21:33.193 回答