Область во фрагменте, вызывающая исключение NullPointerException

Я не понимаю, как обрабатывать Realm во фрагментах, когда активность фрагмента расширяет базовую активность, которая контролирует Realm.

Другими словами, у меня такая структура:

Базовая активность -> Действия пользователя -> Базовый фрагмент -> Фрагмент

Все работает нормально, пока я не выйду из действия (т.е. не вернусь к предыдущему действию). Я получаю такую ​​ошибку:

java.lang.RuntimeException: невозможно уничтожить действие {UserActivity}: java.lang.NullPointerException: попытаться вызвать виртуальный метод void io.realm.Realm.close () для ссылки на нулевой объект

...

Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод void io.realm.Realm.close () для ссылки на нулевой объект в BaseFragment.onDestroyView

Моя основная деятельность:

public abstract class BaseActivity extends AppCompatActivity {
    private Realm realm;

    protected abstract int getLayoutResource();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutResource());

        realm = Realm.getDefaultInstance();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        realm.close();
    }

    public Realm getRealm() {
        return realm;
    }
}

Моя основная деятельность (где создаются фрагменты):

public class UserActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String type = getIntent().getStringExtra("type");

        Fragment fragment = null;
        if (findViewById(R.id.fragment_container) != null) {
            if (savedInstanceState != null) {
                return;
            }

            if (type.equals("first")) {
                fragment = new FirstFragment();
            } else if (type.equals("second")) {
                fragment = new SecondFragment();
            }

            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, fragment).commit();
        }
    }

    @Override
    protected int getLayoutResource() {
        return R.layout.activity_user;
    }
}

И все мои фрагменты расширяют базовый фрагмент. Вот мой базовый фрагмент:

public abstract class BaseFragment extends Fragment {

    private Realm realm;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        realm = Realm.getDefaultInstance();

        return inflater.inflate(getFragmentLayout(), container, false);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        realm.close();
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        realm.executeTransaction(new Realm.Transaction() {
            @Override
                public void execute(Realm realm) {
                    // some realm operation
                }
        });
    }

    protected abstract int getFragmentLayout();
}

Что вызывает проблему? Я неправильно управляю Realm?


person user656217    schedule 13.04.2017    source источник
comment
попробуйте поставить вызов realm.close () перед суперметодом?   -  person aProperFox    schedule 14.04.2017
comment
По-прежнему вызывает NPE, к сожалению. : /   -  person user656217    schedule 14.04.2017


Ответы (1)


Избавьтесь от realm.close(); в вашем BaseFragment, который будет закрыт, когда вы уничтожите активность, поэтому вы собираетесь закрыть его дважды, поэтому вы получаете NPE. Итак, если вы удалите realm.close(); в своем фрагменте и позволите Activity обрабатывать закрытие Realm.

person BlackHatSamurai    schedule 13.04.2017