java - 如何使用 synchronization(){} block 在 android 中保护方法免受并行访问

标签 java android multithreading synchronized

我有以下 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/

相关文章:

c++ - boost::lockfree::spsc_queue、boost::lockfree::queue、串行队列操作之间的比较

java - 使用 Apache Camel AdviceWith 和 weaveById 进行测试

java - 运行时异常无法启动 MainActivity

android - 用户删除事件时如何删除警报?

java - 如何正确使用回调接口(interface)从 onDataChange 获取 RecyclerView 的值列表?

java - 使用多线程访问sqlite数据库时抛出FilePermission错误

java - 暂停和恢复正在 hibernate 的 Java 线程

java - 尝试使用 dom 解析 xml 页面时出现空指针异常

java - 跟踪通过 Java Web Start 启动的客户端应用程序的关闭

java - 什么是 spring-boot-configuration-processor ?为什么人们将图书馆排除在外?为什么它在依赖树中不可见?