2017-02-06 10 views
0

setRetainInstance(true)によって状態を保存するフラグメントがあります。これは私のフラグメントの非常に単純化されたコードです:NullPointerExceptionOSによって殺されたアクティビティの後でフラグメントのsavedInstanceStateがnullでない

public class MyFragment extends Fragment { 
    private SomeData mData; 

    public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     if (savedInstanceState == null) { 
     mData = new SomeData(getView()); 
     } else { 
     mData.refresh(getView()); 
     } 
     // More awesome code 
    } 
    } 
} 

時々、アプリがクラッシュ - 私のmDataが突然nullになります。これは、アプリケーションを折り畳んでしばらくしてから戻ると起こります。

私はいくつかの理論を持っています。しばらくすると、OSはActivityFragmentを殺す(setRetainInstance (true)にもかかわらず)。こうして、私のフラグメントの新しいオブジェクトを作成します。ここで、で初期化されたmDataです。しかし、savedInstanseStateはnullと等しくありません。したがって、新しいフラグメントは初期化をスキップし、NULL参照でrefresh(View)を呼び出そうとします。

私の質問:OSがアクティビティ(アプリではない、画面上)と再作成復帰後を殺すとき は何私のスニペットでonActivityCreated(savedInstanceState)方法でsavedInstanseState変数が含まれているのだろうか?答えはわからない

答えて

0

は完全けど、ここで、それは私が

setRetainInstanceを(ブール値が保持)コントロールフラグメントインスタンス は、このような構成 変更からと(活動の再作成も保持されているかどうかを推測することができますどのようなものです)。 これは、バックスタックにないフラグメントでのみ使用できます。

は、だから私は、あなたが活動を折るときのビューが破壊を取得し、インスタンスデータ(setReetainInstance値)は、バンドル内に保存されていることを考える(savedInstanceState作る!= nullをロードしている間)。ただし、以前はretainInstanceがtrueに設定されていたため、アクティビティをロードするときにonCreate()が呼び出されず、savedInstanceState!= nullおよびmData == nullになってからエラーが発生します。

関連する問題