2016-11-06 54 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。 –

相關問題