1

Fragment 互換パッケージを使用しています。

onAttach の Fragment では、Context参照を保持しています。

public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.w(logTag, "Activity is: " + activity);
    mContext = activity;
    Log.w(logTag, "mContext is: " + mContext); // <-- Breakpoint here
}

後で、コンテキストを使用します

private String loadExampleSuccessXML () {
    try {
        AssetManager assets = this.mContext.getAssets(); // <-- Breakpoint here
        //Other Stuff

向きを変えると、onAttach は新しいコンテキストを保存しているように見えますが、に到達するとloadExampleSuccessXMLmContextnull になります。

mContextが onAttach に保存された後にブレークポイントがありますmContext.getAsssets()

アプリを初めて実行すると、デバッガーに mContext の値が表示されます。

onAttach(), mContext [MyActivity] (id=830010419632)

loadExampleSuccessXML(), mContext [MyActivity] (id=830010419632)

しかし、その後、構成の変更後

onAttach(), mContext [MyActivity] (id=830010565472)

loadExampleSuccessXML(), mContext null

理由がわかりません。どんな助けでも素晴らしいでしょう。

4

2 に答える 2

1

私の経験として、向きの変更を処理する必要があります。

<activity
    android:name="com..."
    android:configChanges="orientation|keyboardHidden" />

参考文献:

于 2012-07-13T09:47:34.593 に答える
1

コンテキストへの参照を維持する必要がある理由について、もう少し詳しく教えていただけますか? これは、少なくとも私たちのアプリの要件ではなく、Android のメモリ リークの主な原因であることが示されています (ただし、投稿したコードからはそうではありません)。

以前のアクティビティの状態の側面を維持する必要がある場合は、 を使用することをお勧めしonSavedInstanceState()ます。ここでは、いくつかの単純なプロパティ (リストで最後に選択したアイテムの ID など) を渡すことができます。マニフェスト構成の修正は、このようなヘルプ サイトで広く行われているにもかかわらず、通常は間違ったアプローチです。あなたはおそらくそれを望んでいません。

最後に、使用方法を調べてくださいsetRetainInstance(true)...繰り返しますが、私たちの経験では、これは誤って使用すると非常に危険な方法です! それはおそらく私たちだけですがandroid.support.v4.*、少なくとも最近のライブラリにはいくつかのバグがあります。これに設定trueすると、フラグメントが破棄される (つまりonDestroy()、呼び出される) ことはなく、ローテーション時にアクティビティが破棄されて再作成されるため、単純にアタッチおよびデタッチされます。それはあなたの問題を分類しますが、その使用法に関するドキュメントを読んでください...副作用のいくつかは非常に微妙です。

于 2012-07-13T10:03:12.570 に答える