我有以下 Activity :
public class FaceActivity extends BiometricActivity implements CameraControlsListener
这个activity的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 函数。当我不止一次点击它,而不是等待相机改变并开始捕捉时,可能会发生一些赛车情况,然后不知何故相机输出不显示。所以我想使用 synchronization(){} block 保护该方法免受并行访问。
我在 switchCamera 按钮的 onClick 方法中保留了 syncronized 关键字,但它不起作用。如何保护方法免受并行访问?
最佳答案
一般来说,您应该检查相机回调:通过相机回调(onActive、onClosed),您将知道何时启用或不启用按钮。
您尝试使用 synchronized
的方式实际上没有任何意义,因为您需要同步,但不是在访问同一个“软件”对象到同一个对象的意义上来自不同线程的时间。您需要与相机驱动程序同步。
我的意思是两次启用相机没有意义,只需等到它完成并提供再次禁用它的选项即可。
搜索您的 createCaptureSession()
调用并在 CameraCaptureSession.StateCallback
中添加处理按钮的启用状态。
关于java - 如何使用 synchronization(){} block 在 android 中保护方法免受并行访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43649054/