Внутри фрагмента, где правильно инициализировать OpenCV4Android?

В следующем фрагменте показано, как OpenCV4Android инициализируется в Activity, например. в это пример приложения, но мне нужно сделать это внутри Fragment (потому что мой JavaCameraView находится в моем фрагменте).

Я бы сделал это точно так же, как это было сделано в Activity, т.е. я бы инициализировал baseLoaderCallback непосредственно внутри тела класса (вне тела любого метода), но таким образом код инициализации (4-й оператор в следующем фрагменте) будет выполнен, как только поскольку создается экземпляр Fragment.

Как мы видим, конструктор BaseLoaderCallback принимает контекст приложения в качестве аргумента, и я не могу вызвать getActivity() до вызова onActivityCreated(), потому что до onActivityCreated() конструктор 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);
    }
    ...
}

person Solace    schedule 08.04.2016    source источник


Ответы (1)


Несмотря на то, что вы инициализируете baseLoaderCallback в теле класса (выполняется непосредственно перед телом конструктора), onManagerConnected обратного вызова не вызывается до тех пор, пока не завершится OpenCVLoader.initAsync, то есть до onResume.

Если вы хотите избежать вызова getActivity() перед onAttach (поскольку он вернет null), просто поместите инициализатор для baseLoaderCallback в onResume, так как до тех пор он вам не нужен.

person szym    schedule 09.04.2016
comment
Да, но getActivity() вызывается в этот момент (перед конструктором), а getActivity() нельзя вызывать перед onActivityCreated() - это проблема. - person Solace; 09.04.2016
comment
getActivity() вызывается там, потому что там нужен контекст приложения. - person Solace; 09.04.2016
comment
Ах, я обновил свой ответ. Если у вас все в порядке с вызовом initAsync в onResume, тогда только инициализируйте baseLoaderCallback. - person szym; 09.04.2016