簡體   English   中英

導航離開片段后調用 onCreate 和 onDestroy

[英]onCreate and onDestroy called after navigating away fragment

我注意到在我的 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()在離開它之后仍然被調用? 這可能是 memory 泄漏嗎?

編輯:這是我的崩潰日志。

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

當片段仍然是當前片段時不會發生此異常,而只會在用戶通過底部導航欄從它導航到其他片段時發生。

編輯:澄清一下,我不是在問為什么會發生崩潰(甚至可以忽略崩潰),我想知道為什么在片段導航離開后仍然調用onCreateonDestroy方法。 該片段應該在導航離開后被銷毀,但它似乎仍在運行,因為我仍然從 logcat 接收 onCreate 和 onDestroy 的日志。 為什么會這樣?

謝謝。

你的日志顯示

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.MutableLiveData com.example.app.ui.InfoViewModel.performOperation()' 在 null object 參考

並且您的視圖模型尚未聲明,請嘗試在 onCreate 方法中聲明它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM