2013-09-07 10 views
7

私はその保持フラグメントをuiで参照し、ビュー上の参照はメモリリークを引き起こす可能性があります。私はいくつかの参照をビューに保存し、setRetaineInstance(true)を設定するフラグメントでテストアプリケーションを作成しますが、いくつかの画面の回転ではリークは発生しません。 MATは、親アクティビティのインスタンスが1つしかないと言います。私は間違っているの?どのような場合にuiでフラグメントを保持するとリークが発生する可能性がありますか?なぜUIでフラグメントを保持しないことをお勧めしますか?

RetainInstanceActivity.java

public class RetainInstanceActivity extends FragmentActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState); 

    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(android.R.id.content, RetainFragment.newInstance()) 
       .commit(); 
    } 
}} 

RetainFragment.java

public class RetainFragment extends Fragment { 

private View mLogin; 
private View mPassword; 
private View ImageView; 

public static RetainFragment newInstance() { 
    final RetainFragment fragment = new RetainFragment(); 

    return fragment; 
} 

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

@Override 
public View onCreateView(final LayoutInflater inflater, 
     final ViewGroup container, final Bundle savedInstanceState) {  
    final View view = inflater.inflate(R.layout.fragment_retain, container, 
      false); 

    mLogin = view.findViewById(R.id.login); 
    mPassword = view.findViewById(R.id.password); 
    ImageView = view.findViewById(R.id.img); 

    return view; 
} 

}

+0

これはあなたがここに記載されて見たことがありますか? – Kerry

+0

[Here](http://stackoverflow.com/questions/13421945/retained-fragments-with-u-and-memory-leaks?answertab=votes#tab-top)を参照してください。 – Bracadabra

答えて

7

ここでは、古い活動のmLogin、mPasswordとImageViewのビューへの参照を保持しているが、それらは上書き正しいですローテーション後にonCreateView()が呼び出されるため、アクティビティがフロントアクティビティであり、コンフィグレーションの変更が発生した場合は正常に動作するはずです。

あなたの活動は、フロントアクティビティをイマイチ場合ときには、しかし、メモリリークに遭遇するかもしれない、と一般的に、あなたの断片がどのように扱われるかを知ることはできません。

たとえば、ViewPagerには2つの異なるアダプタがあります(http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html)は、(onDestroyView()を呼び出すだけで)フラグメントインスタンスを保持し、もう一方(FragmentStatePagerAdapter)はフラグメントインスタンスを破棄します。

フラグメントは、FragmentPagerAdapterから使用すると、大きなメモリをリークします。

私はこれが潜在的な問題の例として役立つことを願っています。あなたが何をしているのか分かっていれば、setRetaineInstance(true)を呼び出してビューを破棄しても問題はありません。

+0

あなたの答えをありがとうが、それはこのように動作していないようです。 2つのアダプターと10ページのページャーを持つテストアプリケーションを作成しましたが、最後までページングした後、画面の回転とページングを戻すと、FragmentPagerAdapterのフラグメントが10個、FragmentStatePagerAdapterのインスタンスが10個残っています。 – Bracadabra

+0

あなたはどこかでZIPファイルを置いて、何かが起こっているのを見るために、完全なプロジェクトを私に見せてください。 –

+0

この[repo](https://github.com/Drnkn/RetainInstanceTest)からプロジェクトを手に入れることができます。 – Bracadabra

関連する問題