为什么在Activity被销毁时调用DialogFragment.onCreateView?

问题描述:

我正在使用android支持库v4修订版11和时间,我看到下面的堆栈跟踪;我怀疑这是由于从最近发起的,因此我尝试访问的模型为null。无论如何,这个跟踪让我想知道为什么onCreateView在活动被销毁时被调用,以及处理这种情况的最佳方式是什么?为什么在Activity被销毁时调用DialogFragment.onCreateView?

java.lang.NullPointerException 
    at com.example.dialogs.ExampleDialogFragment.onCreateView(ExampleDialogFragment.java:53) 
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
    at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:1888) 
    at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:787) 
    at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:764) 
    at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322) 
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642) 
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673) 
    at android.app.ActivityThread.access$2900(ActivityThread.java:125) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4627) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 

崩溃从后堆栈的活动结束后重新开始,我做检查,如果该模型是在活动onResume()onStart()onCreate(Bundle savedInstanceState)有效。如果模型无效,我从FLAG_ACTIVITY_NO_HISTORY开始另一个活动,请致电和return;INTENT_RESTART活动与重新初始化有标志FLAG_ACTIVITY_CLEAR_TOP它开始活动模型完成

@Override 
public void onResume() {   
    Model cm = Application.getModel(); 
    final boolean isModelAvailable = cm != null; 
    if (!isModelAvailable) { 
     Intent restartIntent = IntentUtil.intentForAction(Constants.INTENT_RESTART); 
     restartIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
     startActivity(restartIntent); 
     finish(); 
     super.onResume(); 
     return; 
    } else { 

    } 

后,本次活动提交交易片段FirstFragment

查看日志,FragmentManager.enableDebugLogging(true);

05-13 13:24:53.051: V/FragmentManager(7468): Commit: BackStackEntry{40710fa0} 
05-13 13:24:53.111: V/FragmentManager(7468): Commit: BackStackEntry{40771e78} 
05-13 13:24:53.151: V/FragmentManager(7468): Run: BackStackEntry{40710fa0} 
05-13 13:24:53.151: V/FragmentManager(7468): add: RetainFragment{4077d048 app_ImageCache} 
05-13 13:24:53.151: V/FragmentManager(7468): Allocated fragment index RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.151: V/FragmentManager(7468): moveto CREATED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.151: V/FragmentManager(7468): moveto ACTIVITY_CREATED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.151: V/FragmentManager(7468): Run: BackStackEntry{40771e78} 
05-13 13:24:53.151: V/FragmentManager(7468): add: FirstFragment{4077dfa8 id=0x7f04000d} 
05-13 13:24:53.151: V/FragmentManager(7468): Allocated fragment index FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:24:53.151: V/FragmentManager(7468): moveto CREATED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:24:53.151: V/FragmentManager(7468): moveto ACTIVITY_CREATED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:24:53.791: V/FragmentManager(7468): moveto STARTED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.791: V/FragmentManager(7468): moveto STARTED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:24:53.811: V/FragmentManager(7468): moveto RESUMED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:24:53.811: V/FragmentManager(7468): moveto RESUMED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 

05-13 13:25:58.414: V/FragmentManager(7468): Commit: BackStackEntry{40727530} 
05-13 13:25:58.434: V/FragmentManager(7468): Run: BackStackEntry{4078fe00} 
05-13 13:25:58.434: V/FragmentManager(7468): add: RetainFragment{4076f1b0 app_ImageCache} 
05-13 13:25:58.434: V/FragmentManager(7468): Allocated fragment index RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.434: V/FragmentManager(7468): moveto CREATED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.434: V/FragmentManager(7468): moveto ACTIVITY_CREATED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.434: V/FragmentManager(7468): Run: BackStackEntry{40727530} 
05-13 13:25:58.434: V/FragmentManager(7468): add: SecondFragment{40713c28 id=0x7f04000d} 
05-13 13:25:58.434: V/FragmentManager(7468): Allocated fragment index SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:25:58.434: V/FragmentManager(7468): moveto CREATED: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:25:58.434: V/FragmentManager(7468): moveto ACTIVITY_CREATED: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:25:58.545: V/FragmentManager(7468): moveto STARTED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.545: V/FragmentManager(7468): moveto STARTED: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:25:58.565: V/FragmentManager(7468): moveto RESUMED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:25:58.565: V/FragmentManager(7468): moveto RESUMED: SecondFragment{40713c28 #1 id=0x7f04000d} 

05-13 13:26:02.338: V/FragmentManager(7468): Saved state of RetainFragment{4077d048 #0 app_ImageCache}: null 
05-13 13:26:02.338: V/FragmentManager(7468): Saved state of FirstFragment{4077dfa8 #1 id=0x7f04000d}: Bundle[{android:[email protected]}] 
05-13 13:26:02.338: V/FragmentManager(7468): saveAllState: adding fragment #0: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:26:02.338: V/FragmentManager(7468): saveAllState: adding fragment #1: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:26:02.348: V/FragmentManager(7468): movefrom STARTED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:26:02.348: V/FragmentManager(7468): movefrom STARTED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:26:02.358: V/FragmentManager(7468): movefrom STOPPED: RetainFragment{4077d048 #0 app_ImageCache} 
05-13 13:26:02.358: V/FragmentManager(7468): movefrom STOPPED: FirstFragment{4077dfa8 #1 id=0x7f04000d} 
05-13 13:27:15.219: V/FragmentManager(7468): movefrom RESUMED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:27:15.219: V/FragmentManager(7468): movefrom RESUMED: SecondFragment{40713c28 #1 id=0x7f04000d} 

05-13 13:27:15.239: V/FragmentManager(7468): Commit: BackStackEntry{40a8a6d0} 
05-13 13:27:15.259: V/FragmentManager(7468): Commit: BackStackEntry{40a90190} 

05-13 13:27:15.279: V/FragmentManager(7468): Run: BackStackEntry{40a8a6d0} 
05-13 13:27:15.279: V/FragmentManager(7468): add: RetainFragment{40a7fdf0 app_ImageCache} 
05-13 13:27:15.279: V/FragmentManager(7468): Allocated fragment index RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.279: V/FragmentManager(7468): moveto CREATED: RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.279: V/FragmentManager(7468): moveto ACTIVITY_CREATED: RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.279: V/FragmentManager(7468): Run: BackStackEntry{40a90190} 
05-13 13:27:15.279: V/FragmentManager(7468): add: ThirdFragment{406c2308 id=0x7f04000d} 
05-13 13:27:15.279: V/FragmentManager(7468): Allocated fragment index ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.289: V/FragmentManager(7468): moveto CREATED: ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.289: V/FragmentManager(7468): moveto ACTIVITY_CREATED: ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.410: V/FragmentManager(7468): moveto STARTED: RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.410: V/FragmentManager(7468): moveto STARTED: ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.430: V/FragmentManager(7468): moveto RESUMED: RetainFragment{40a7fdf0 #0 app_ImageCache} 
05-13 13:27:15.430: V/FragmentManager(7468): moveto RESUMED: ThirdFragment{406c2308 #1 id=0x7f04000d} 
05-13 13:27:15.810: V/FragmentManager(7468): Saved state of RetainFragment{4076f1b0 #0 app_ImageCache}: null 
05-13 13:27:15.810: V/FragmentManager(7468): Saved state of SecondFragment{40713c28 #1 id=0x7f04000d}: Bundle[{android:[email protected]}] 
05-13 13:27:15.810: V/FragmentManager(7468): saveAllState: adding fragment #0: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:27:15.810: V/FragmentManager(7468): saveAllState: adding fragment #1: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:27:15.810: V/FragmentManager(7468): movefrom STARTED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:27:15.810: V/FragmentManager(7468): movefrom STARTED: SecondFragment{40713c28 #1 id=0x7f04000d} 
05-13 13:27:15.820: V/FragmentManager(7468): movefrom STOPPED: RetainFragment{4076f1b0 #0 app_ImageCache} 
05-13 13:27:15.820: V/FragmentManager(7468): movefrom STOPPED: SecondFragment{40713c28 #1 id=0x7f04000d} 


// Here I'm waiting for a while to make sure Android has enough time to do anything it wants, then I press a button gorse-closing the app 
05-13 13:27:59.783: D/AndroidRuntime(7468): Shutting down VM 


05-13 13:28:14.928: V/FragmentManager(7523): Instantiated fragment RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:14.938: V/FragmentManager(7523): restoreAllState: active #0: RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:14.938: V/FragmentManager(7523): Instantiated fragment FirstFragment{406d8410 #1 id=0x7f04000d} 
05-13 13:28:14.938: V/FragmentManager(7523): restoreAllState: active #1: FirstFragment{406d8410 #1 id=0x7f04000d} 
05-13 13:28:14.938: V/FragmentManager(7523): restoreAllState: added #0: RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:14.938: V/FragmentManager(7523): restoreAllState: added #1: FirstFragment{406d8410 #1 id=0x7f04000d} 
05-13 13:28:14.938: V/FragmentManager(7523): moveto CREATED: RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:14.938: V/FragmentManager(7523): moveto CREATED: FirstFragment{406d8410 #1 id=0x7f04000d} 

05-13 13:28:15.128: V/msm8660.gralloc(7523): PmemUserspaceAllocator::PmemUserspaceAllocator(PmemUserspaceAllocator::Deps&, PmemUserspaceAllocator::Deps::Allocator&, const char*) begin 
05-13 13:28:15.138: V/msm8660.gralloc(7523): PmemUserspaceAllocator::PmemUserspaceAllocator(PmemUserspaceAllocator::Deps&, PmemUserspaceAllocator::Deps::Allocator&, const char*) end 
05-13 13:28:15.138: V/msm8660.gralloc(7523): PmemKernelAllocator::PmemKernelAllocator(PmemKernelAllocator::Deps&) begin 
05-13 13:28:15.138: V/msm8660.gralloc(7523): PmemKernelAllocator::PmemKernelAllocator(PmemKernelAllocator::Deps&) end 

05-13 13:28:15.408: V/FragmentManager(7523): moveto ACTIVITY_CREATED: RetainFragment{406cde80 #0 app_ImageCache} 
05-13 13:28:15.408: V/FragmentManager(7523): moveto ACTIVITY_CREATED: FirstFragment{406d8410 #1 id=0x7f04000d} 

java.lang.RuntimeException: Unable to destroy activity {com.myapp/com.myapp.activity.FirstFragment}: java.lang.NullPointerException 

05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3272) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3299) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.access$2100(ActivityThread.java:134) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1143) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.os.Looper.loop(Looper.java:152) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.main(ActivityThread.java:4606) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at java.lang.reflect.Method.invoke(Method.java:491) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at dalvik.system.NativeStart.main(Native Method) 

// see the original question log, it is quite the same 
05-13 13:35:41.824: E/AndroidRuntime(7691): Caused by: java.lang.NullPointerException 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at com.myapp/com.myapp.activity.FirstFragment.onCreateView(FirstFragment.java:41) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:1888) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:787) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:764) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at com.myapp.activity.FragmentsContainerActivity.onDestroy(FragmentsContainerActivity.java:806) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.Activity.performDestroy(Activity.java:4662) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1113) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3255) 
05-13 13:35:41.824: E/AndroidRuntime(7691):  ... 11 more 

线#的:

@Override 
public void onDestroy() { 
    try { 
     unregister(receiver); 
    } catch (Exception e) { 
    } 
    super.onDestroy(); 
+0

你能从'ExampleDialogFragment.onCreateView()'发布你的代码吗? – 2013-02-14 03:10:16

+0

您确定活动正在销毁吗?系统很有可能在某个时候从内存中清除了模型,现在只是在用户返回时尝试恢复活动。 – dmon 2013-02-14 04:43:14

+0

@dmon你是正确的,该模型被消灭了,因此NullPointerException异常,我也怀疑它在某些时候被重建,但跟踪显示从FragmentActivity.onDestroy到Fragment.onCreateView一个进展: 机器人。 support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322) – WindsurferOak 2013-02-14 19:32:10

正如code sample here引导参照onResume方法您应该:

始终调用父类的方法首先

意味着你应该把你的super.onResume();正确的一开始。 这一定是问题所在。

在当前正在运行的代码中,您正在混淆被告知停止的FragmentActivity(即finish),然后被告知resume。在活动生命周期中不是“合法”的生命周期。 这些片段直接受到影响,因为它们的生命周期是从活动生命周期中调用的,并且如果活动从完成 - >恢复,它肯定意味着片段从完成/销毁 - >恢复(正在通过onCreateView)

+0

我想知道为什么你有三个upvotes为差不多相同的事情,我写了10个小时之前?提示? ;) – Raanan 2013-05-14 08:08:55

+1

我想这是因为我提供了一个解释和官方的android代码来证明这个问题? – Sean 2013-05-14 08:16:28

+0

我一开始调用超类方法,但在某些设备上,当返回到创建视图上的对话框片段调用而不是简历时,您可以请建议。 – RAHULRSANNIDHI 2015-01-20 07:16:54

请参阅this类似的问题,这说明,你看到相同的行为,但解决的办法可能并不适用于你案件。要解决您的问题,您可以简单地检查代码依赖于onCreateView的任何内容是否为null

+0

我感兴趣的是为什么片段lyfecycle是如此奇怪,因为看到像这样的东西意味着我做错了,'NullPointerException'超出了范围。 – 2013-05-07 17:59:58

没有看到代码,我们无法帮助您解决特定的问题。但是,其中一个,它是一个DialogFragment是无关紧要的。

这就是说,根据我的经验,FragmentManager.enableDebugLogging()当你在生命周期中遇到困难时是一种拯救生命的方法。例如,它会告诉你最后一个moveToState所做的事情(即它在哪个状态之间移动),这可能会对该错误有所了解。

+0

感谢您的提示,添加了日志和导航描述以及一些代码。 – 2013-05-13 10:50:26

对于你的具体问题,你是否在调用finish()之前尝试调用super.resume()?

否则,你应该看看源代码: https://github.com/mastro/android-support-library-archive/blob/23ad71b245e7b7bbde6a501671ab411725ce16f5/v4/src/java/android/support/v4/app/FragmentManager.java

从这个堆栈跟踪线android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)