定时器频繁关闭/打开时应用程序挂起

时间:2013-06-04 13:20:01

标签: android timer camera

我的相机应用程序中有多重拍摄功能。我使用以下简短的代码来做到这一点。

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秒拍照。为了停止计时器,我再一次点击相同的按钮。但如果我不断点击按钮,应用程序会挂起并强行停止。然后我需要关闭我的设备,因为相机被停止服务使用,不能轻轻释放。如何管理启动和停止计时器?

2 个答案:

答案 0 :(得分:1)

您不需要TIMER_STARTED来选择按钮是启动还是停止多重拍摄:您只需选中if (multishotTimer != null)

但即使在此修复之后,点击太快也可能很危险:您不应在takePictureHandlePictureStorage之间创建新的计时器。

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;
    }
}

答案 1 :(得分:0)

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

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