Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当计时器频繁关闭/打开时,应用程序挂起_Android_Timer_Camera - Fatal编程技术网

Android 当计时器频繁关闭/打开时,应用程序挂起

Android 当计时器频繁关闭/打开时,应用程序挂起,android,timer,camera,Android,Timer,Camera,我的相机应用程序中有多镜头功能。我使用下面的简短代码来实现这一点 if (TIMER_STARTED) { multishotTimer.cancel(); multishotTimer.purge(); multishotTimer = null; TIMER_STARTED = false; } else { multishotTimer = new Timer(); multishotTimer.schedule(new TimerTask(

我的相机应用程序中有多镜头功能。我使用下面的简短代码来实现这一点

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\u start是一个布尔标志,指示计时器是否启动HandlePictureStorage是处理PictureCallback的类

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

您需要移动
计时器\u start=true从计时器任务到
其他
部分,例如在调度计时器之后


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

您不需要计时器\u start来选择按钮是启动还是停止多快照:您只需检查
是否(multishotTimer!=null)

但是,即使在这个修复之后,点击过快也可能是危险的:您不应该在
拍摄照片
手持图片存储
之间创建新的计时器

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

但如果我将计时器移动到其他部分,它将禁用5秒,然后在一段时间内启用“禁用”多线程。我从您的答案中得到了一条线索,并修复了问题。:)