我的相机应用程序中有多重拍摄功能。我使用以下简短的代码来做到这一点。
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秒拍照。为了停止计时器,我再一次点击相同的按钮。但如果我不断点击按钮,应用程序会挂起并强行停止。然后我需要关闭我的设备,因为相机被停止服务使用,不能轻轻释放。如何管理启动和停止计时器?
答案 0 :(得分:1)
您不需要TIMER_STARTED来选择按钮是启动还是停止多重拍摄:您只需选中if (multishotTimer != null)
。
但即使在此修复之后,点击太快也可能很危险:您不应在takePicture
和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;
}
}
答案 1 :(得分:0)
您需要将TIMER_STARTED = true;
从计时器任务移至else
部分,例如在安排计时器之后。
要提高性能,您应该创建一个TimerTask
字段,而不是每次创建和启动计时器时都重新创建一个匿名类。