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秒,然后在一段时间内启用“禁用”多线程。我从您的答案中得到了一条线索,并修复了问题。:)