oncreate和ondestroy

2nc8po8w  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(349)

我注意到在我的android应用程序中,在离开一个片段后 onCreate() 以及 onDestroy() 方法仍被调用。这会导致我的代码抛出一个异常作为 onDestroy() 方法引用资源(特别是我的 ViewModel )当碎片被导航离开时不可用。

  1. public class InfoFragment extends Fragment {
  2. private InfoViewModel viewModel;
  3. @Override
  4. public void onCreate(@Nullable Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. Log.i(TAG, "onCreate");
  7. /* ... other initialization code ... */
  8. }
  9. @Override
  10. public void onDestroy() {
  11. super.onDestroy();
  12. Log.e(TAG, "onDestroy");
  13. viewModel.performOperation(); // NullPointerException occurs after fragment is navigated away from, and screen is rotated
  14. }

(请注意,这些不是片段和viewmodel的真实名称)
为什么是 onCreate() 以及 onDestroy() 我的碎片在离开它后仍然被召唤?这可能是内存泄漏吗?
编辑:这是我的事故日志。

  1. 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
  2. at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4551)
  3. at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4569)
  4. at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:4853)
  5. at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4786)
  6. at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:69)
  7. at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
  8. at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
  9. at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1858)
  10. at android.os.Handler.dispatchMessage(Handler.java:106)
  11. at android.os.Looper.loop(Looper.java:201)
  12. at android.app.ActivityThread.main(ActivityThread.java:6820)
  13. at java.lang.reflect.Method.invoke(Native Method)
  14. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
  15. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)
  16. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.MutableLiveData com.example.app.ui.InfoViewModel.performOperation()' on a null object reference
  17. at com.example.app.ui.InfoFragment.onDestroy(InfoFragment.java:202)
  18. at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2927)
  19. at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:492)
  20. at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1296)
  21. at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
  22. at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
  23. at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1504)
  24. at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
  25. at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2609)
  26. at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2922)
  27. at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:492)
  28. at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1296)
  29. at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
  30. at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
  31. at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
  32. at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
  33. at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2609)
  34. at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:330)
  35. at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:365)
  36. at androidx.appcompat.app.AppCompatActivity.onDestroy(AppCompatActivity.java:242)
  37. at android.app.Activity.performDestroy(Activity.java:7524)
  38. at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1307)
  39. at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4536)
  40. ... 13 more

当片段仍然是当前片段时,不会发生此异常,但只有当用户通过底部导航栏从片段导航到其他片段时,才会发生此异常。
编辑:澄清一下,我不是在问为什么会发生车祸(车祸甚至可以忽略不计),我想知道为什么会发生车祸 onCreate 以及 onDestroy 方法在片段被导航离开后仍然被调用。该片段应该在导航离开后被销毁,但它似乎仍在运行,因为我仍然从logcat接收oncreate和ondestroy的日志。为什么会这样?
谢谢。

w51jfk4q

w51jfk4q1#

你的日志显示
原因:java.lang.nullpointerexception:尝试对空对象引用调用虚拟方法“androidx.lifecycle.mutablelivedata com.example.app.ui.infoviewmodel.performoperation()”
如果您的viewmodel尚未声明,请尝试在oncreate方法中声明它

相关问题