在Fragment中,初始化OpenCV4Android的正确位置是什么?

时间:2016-04-08 23:48:47

标签: android opencv android-fragments android-context opencv4android

以下代码段显示了如何在Activity中初始化OpenCV4Android,例如在this sample app,但我需要在Fragment内进行(因为我的JavaCameraView在我的片段中)。

我会像在Activity中那样做,即我会直接在类体内(在任何方法体外)初始化baseLoaderCallback,但这样,初始化代码(以下代码段中的第4个语句)将在Fragment实例化后立即执行。

正如我们所看到的,BaseLoaderCallback构造函数将应用程序上下文作为参数,在调用getActivity()之前我无法调用onActivityCreated(),因为在onActivityCreated()之前{1}},getActivity()可以返回null。

public class AnActivity extends Activity implements CvCameraViewListener2 {
    ...
    private JavaCameraView javaCameraView;
    ...

    private CameraBridgeViewBase cameraBridgeViewBase;

    BaseLoaderCallback baseLoaderCallback = new BaseLoaderCallback(getActivity().getApplicationContext()) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
            case LoaderCallbackInterface.SUCCESS:
                cameraBridgeViewBase.enableView();
                break;
            default:
                super.onManagerConnected(status);
                break;
            }
        }
    };

    ...

    //SOME LIFE CYCLE CALL BACK METHODS

    @Override
    public void onResume() {
        super.onResume();       
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, getActivity().getApplicationContext(),
                baseLoaderCallback);
    }
    ...
}

1 个答案:

答案 0 :(得分:1)

即使你在类体中初始化onManagerConnected(在构造函数体之前执行),在OpenCVLoader.initAsync完成之前不会调用回调函数onResume,所以直到getActivity()

如果您想避免在onAttach之前调用null(因为它会返回baseLoaderCallback),那么只需将onResume的初始化程序放在/dev/sdb1 /media/mystuff ext3 defaults 1 2 中直到那时你才真正需要它。