2016-11-06 49 views
3

我正在经历一次非常罕见的(几千次会话中的一次)崩溃,我试图追查。我有一个,在它的onCreate覆盖,它会创建一些片段,但不显示或附加任何他们的活动:在Activity的onCreate完成之前可以调用片段的onAttach?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.activity_main); 

    mainMenuFragment = new MainMenuFragment(); 
    locationFragment = new LocationFragment(); 

    mainPresenter = new MainPresenter(this); 
} 

在这段代码中,我也创建了“MainPresenter”,它来自哪个包含一个库我们所有的业务逻辑。主讲人是从片段的onAttach方法使用:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    MainActivity mainActivity = (MainActivity) activity; 
    mainPresenter = mainActivity.getMainPresenter(); 
    mainPresenter.refreshUI(); 
} 

问题是,很少,我凑了onAttach空PTR例外。是否有可能在活动的onCreate完成之前(即mainPresenter为空)在片段的onAttach被执行的情况下?

更新

这里是调用堆栈导致崩溃的原因,如果它是有帮助的一部分:

android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3253) 
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3349) 
android.app.ActivityThread.handleRelaunchActivity (ActivityThread.java:5383) 
android.app.ActivityThread.access$1200 (ActivityThread.java:221) 
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1800) 
android.os.Handler.dispatchMessage (Handler.java:102) 
android.os.Looper.loop (Looper.java:158) 
android.app.ActivityThread.main (ActivityThread.java:7225) 
java.lang.reflect.Method.invoke (Method.java) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230) 
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120) 
+0

本周我遇到了这个问题。我发现如果我通过Android Studio的Android监视器选项卡在后台终止应用程序后重新启动应用程序,这种情况会更常见。如果您需要可靠的复制测试,那可能会有用。 – stkent

+0

@stkent - 谢谢,我会试一试 – user3690202

回答

2

是。请参阅文档https://developer.android.com/reference/android/app/Fragment.html#onCreate(android.os.Bundle)。 Fragment.onAttach发生在Fragment.onCreate之前,并且如果onCreate的文档说明该活动仍然可以在此生命周期方法中创建的过程中,那么这意味着它肯定可以在onAttach中进行构建,而这正是onCreate之前发生的。至于你的具体情况,如果这是你的整个onCreate活动,那么这些片段根本就没有挂钩到应用程序中;他们还没有通过片段管理器添加。它们只是实例化的,不能有Android生命周期调用。我认为有一些更复杂的事情发生,并且在发生配置更改后或者发生崩溃时重新添加碎片。

+0

嗨,是的,这就是我的onCreate的全部内容,并且您已经达到了这个问题的重点 - 我已经看到您链接的文档,但是重点是这些片段还没有被添加到片段管理器中,如你所说,似乎正在发生一些更复杂的事情,并且我正在寻找关于可能是什么的答案。 – user3690202

+0

我已经用部分调用堆栈更新了这个问题,以便提供对这个奇怪问题的深入了解。 – user3690202

+0

由于handleRelaunchActivity在该堆栈中,因此可能会在配置更改期间发生。在配置更改之前附加的片段在创建活动之前正在重新附加到活动(由片段管理器)。您可以调用getActivity()并将其转换为onActivityCreated()中的MainActivity。 –

相关问题