onCreate и onDestroy вызываются после перехода от фрагмента

Я заметил, что в моем приложении для Android после перехода от фрагмента методы onCreate() и onDestroy() все еще вызываются. Это приводит к тому, что мой код выдает исключение, поскольку метод onDestroy() ссылается на ресурсы (в частности, на мой ViewModel), которые недоступны при переходе от фрагмента.

public class InfoFragment extends Fragment {

    private InfoViewModel viewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate");

        /* ... other initialization code ... */
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy");
        viewModel.performOperation(); // NullPointerException occurs after fragment is navigated away from, and screen is rotated
    }

(обратите внимание, что это не настоящие имена фрагмента и модели просмотра)

Почему onCreate() и onDestroy() моего фрагмента все еще вызываются после перехода от него? Может ли это быть утечка памяти?

РЕДАКТИРОВАТЬ: Вот мой журнал сбоев.

java.lang.RuntimeException: Unable to destroy activity {com.example.app/com.example.app.ui.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.MutableLiveData com.example.app.ui.InfoViewModel.performOperation()' on a null object reference
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4551)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4569)
    at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:4853)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4786)
    at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:69)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1858)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:201)
    at android.app.ActivityThread.main(ActivityThread.java:6820)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.MutableLiveData com.example.app.ui.InfoViewModel.performOperation()' on a null object reference
    at com.example.app.ui.InfoFragment.onDestroy(InfoFragment.java:202)
    at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2927)
    at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:492)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1296)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
    at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1504)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2609)
    at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2922)
    at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:492)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1296)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
    at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2609)
    at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:330)
    at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:365)
    at androidx.appcompat.app.AppCompatActivity.onDestroy(AppCompatActivity.java:242)
    at android.app.Activity.performDestroy(Activity.java:7524)
    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1307)
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4536)
    ... 13 more

Это исключение не происходит, когда фрагмент все еще является текущим фрагментом, а только тогда, когда пользователь переходит от него к другим фрагментам через нижнюю панель навигации.

Изменить: чтобы уточнить, я не спрашиваю, почему произошел сбой (сбой можно даже игнорировать), я хочу знать, почему методы onCreate и onDestroy все еще вызываются после того, как фрагмент удален. Фрагмент должен быть уничтожен после его перемещения, но кажется, что он все еще работает, поскольку я все еще получаю журналы от logcat как для onCreate, так и для onDestroy. Почему это происходит?

Спасибо.


person LCZ    schedule 03.12.2020    source источник
comment
NullPointerException Ваша модель просмотра null. Можете ли вы добавить журнал сбоев?   -  person Prince Ali    schedule 04.12.2020


Ответы (1)


Ваш журнал показывает

Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод «androidx.lifecycle.MutableLiveData com.example.app.ui.InfoViewModel.performOperation()» для нулевой ссылки на объект

и ваша модель просмотра еще не объявлена, попробуйте объявить ее внутри метода onCreate

person sirupmarjan    schedule 05.12.2020
comment
viewModel объявлен в onCreateView. Этот сбой происходит не тогда, когда фрагмент находится в фокусе, а когда в фокусе находится другой фрагмент, а от этого фрагмента происходит перемещение. - person LCZ; 05.12.2020