Область во фрагменте, вызывающая исключение NullPointerException
Я запутался в том, как обращаться с Царством в фрагментах, когда активность фрагмента расширяет базовую активность, которая контролирует Царство.
Другими словами, у меня есть эта структура:
Базовая активность -> Активность пользователя -> Базовый фрагмент -> Фрагмент
Все работает нормально, пока я не выйду из активности (т.е. вернусь к предыдущей активности). Я получаю эту ошибку:
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();
}
В чем причина проблемы? Я неправильно управляю Царством?
1 ответ
Избавиться от realm.close();
в вашем BaseFragment
это будет закрыто, когда вы уничтожите действие, поэтому вы будете закрывать его дважды, поэтому вы получаете NPE. Так что если вы удалите realm.close();
в вашем фрагменте, и пусть активность обрабатывает закрытие Realm
,