块I具有以下活性:如何保护的方法从与同步并行访问(){}在机器人
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();
}
});
}
}
onSwitchCamera函数在FaceAcivity中被覆盖,该值为fo llows:
@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方法中保留了syncronized关键字,但它不起作用。如何保护并行访问方法?
如果不需要并发性,为什么不使用布尔值来等待第一个操作完成? –
您是否可以禁用'switchCamera按钮',以便它不能被多次按下? –
我想通过同步来保护并行访问方法(){} block –