2016-11-06 16 views
3

私は追跡しようとしている非常にまれな(数千のセッションのうちの1つ)クラッシュを経験しています。私はそれがのonCreateオーバーライドだ時に、それはいくつかの断片を作成しますが、それらのいずれかを表示したり、付着しない、活動を持っています。このコードではアクティビティの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が終了する前にフラグメントのonAttachが実行されている可能性がありますか(つまり、mainPresenterがnull)?

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モニタータブを使ってアプリをバックグラウンドで終了した後にアプリを再起動したほうが一般的であることがわかりました。テストのために信頼性の高い複製が必要な場合は、役立つかもしれません。 – stkent

+0

@stkent - ありがとう、私はそれを試してみましょう – user3690202

答えて

2

はい:ここ

更新

は、それが役に立つ場合のクラッシュに至るまでのコールスタックの一部です。 https://developer.android.com/reference/android/app/Fragment.html#onCreate(android.os.Bundle)のドキュメントを参照してください。 Fragment.onAttachはFragment.onCreateの前に発生し、onCreateのドキュメントでこのライフサイクルメソッド中にアクティビティがまだ作成中であると表示された場合、onCreateの前に発生するonAttachで確実に構築中であることを意味します。

特定のシナリオに関しては、それがアクティビティのonCreate全体である場合、それらのフラグメントはアプリケーションにまったくフックされません。彼らはフラグメントマネージャー経由で追加されていません。それらはインスタンス化されているだけで、まだAndroidライフサイクルコールを受け取ることはできません。私は何かもっと複雑なことが起こっていると仮定し、その断片は構成の変更やクラッシュしたときに何かの後に再追加されていると仮定します。

+0

こんにちは、私のonCreateの全体です、あなたは質問のポイントにヒットしました - 私はあなたがリンクしているドキュメントを見てきましたが、ポイントはこれらのフラグメントはまだフラグメントマネージャーに追加されていないので、あなたが言うように、もっと複雑なものが起こっているように見えますが、私はそれが何であるかについての答えを探していました。 – user3690202

+0

私は奇妙な問題の洞察を提供する場合に備えて、コールスタックの一部で質問を更新しました。 – user3690202

+0

handleRelaunchActivityはそのスタック内にあるため、構成変更中に発生する可能性があります。構成が変更される前に接続されたフラグメントは、アクティビティーが作成される前に、(フラグメント・マネージャーによって)アクティビティーに再接続されています。 getActivity()を呼び出して、onActivityCreated()のMainActivityにキャストできます。 –

関連する問題