【发布时间】:2017-09-24 17:36:23
【问题描述】:
我有以下活动:
public class FaceActivity extends BiometricActivity implements CameraControlsListener
本次活动的onCreate方法如下:
controlsView = new CameraControlsView(this, this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
controlsView.setLayoutParams(params);
layout.addView(controlsView);
CameraControlsView 类如下:
public class CameraControlsView extends LinearLayout {
// ===========================================================
// Public types
// ===========================================================
public interface CameraControlsListener {
void onSwitchCamera();
void onChangeFormat();
}
// ===========================================================
// Private fields
// ===========================================================
private CameraControlsListener mListener;
// ===========================================================
// Public constructor
// ===========================================================
public CameraControlsView(Context context, CameraControlsListener listener) {
super(context);
if (listener == null) throw new NullPointerException("listener");
mListener = listener;
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = mInflater.inflate(R.layout.camera_controls, this, true);
ImageView switchCamera = (ImageView) view.findViewById(R.id.switch_camera);
switchCamera.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
synchronized (this) {
mListener.onSwitchCamera();
}
}
});
ImageView changeFormat = (ImageView) view.findViewById(R.id.change_format);
changeFormat.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mListener.onChangeFormat();
}
});
}
}
FaceAcivity 中重写了 onSwitchCamera 函数,如下所示:
@Override
public void onSwitchCamera() {
if (!FacePreferences.isUseLiveness(this)) {
cancel();
NCamera currentCamera = client.getFaceCaptureDevice();
for (NDevice device : client.getDeviceManager().getDevices()) {
if (device.getDeviceType().contains(NDeviceType.CAMERA)) {
if (!device.equals(currentCamera)) {
client.setFaceCaptureDevice((NCamera) device);
startCapturing();
break;
}
}
}
}
}
当我按下 switchCamera 按钮时,onSwitchCamera 函数被调用。当我多次单击它,而不是等待相机更改并开始捕捉时,可能会发生一些赛车情况,然后以某种方式未显示相机输出。所以我想保护该方法免受同步访问的并行访问(){}块。
我在 switchCamera 按钮的 onClick 方法中保留了同步关键字,但它不起作用。如何保护方法免受并行访问?
【问题讨论】:
-
如果不需要并发,为什么不使用布尔值等待第一个操作完成?
-
你能不能不禁用
switchCamera button,让它不能被多次按下? -
我想通过同步(){} 块保护方法免受并行访问
-
那你为什么不像
public synchronized void onSwitchCamera() { }那样简单地同步方法。 -
同步块或方法会阻塞 UI 线程。因此不建议您的情况。
标签: java android multithreading synchronized