1

私の Android アプリケーションには、リスト ビューとリスト アイテムの詳細ビューがあります。

リストビューと詳細ビューは、1 つのアクティビティ内のフラグメントです。最初にリスト フラグメントをアクティビティにロードし、ユーザーがリスト アイテムをクリックすると、同じビューが詳細フラグメントに置き換えられ、そのフラグメントが 1 つのアクティビティ内のバックスタックに追加されます

コード:

    String backStateName =  fragment.getClass().getName();
    String fragmentTag = backStateName;
    FragmentManager manager = activity.getSupportFragmentManager();
    boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);
    if ( !fragmentPopped && manager.findFragmentByTag(fragmentTag) == null){ 
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(R.id.main_place_holder, fragment, fragmentTag);
        ft.addToBackStack(backStateName);
        ft.commit();
    }

ユーザーが戻るボタンをクリックすると、リスト ビューになるので問題ありません。

だから私の問題は、ユーザーがリストアイテムアプリを数回(10回以上)クリックするとOutOfMemoryでクラッシュすることです

私が検索したところ、これはバックスタックの通常の動作であり、追加されたフラグメントがスタックからポップされたとしても、メモリから追加されたフラグメントがクリーンアップされないと言う人がいます。

ビジネス要件のため、これに 2 つのアクティビティを設定することはできません。

リストと詳細のフラグメントが同じアクティビティを持ち、バックスタックを使用してナビゲートするのが最善の方法ではないという私のアプローチではありませんか?

そうでない場合、私が従うべき最善の選択肢は何ですか?

4

1 に答える 1

-1

ただし、フラグメントがバックスタックに置かれると、その onDestroyView() が呼び出されます。その時点で、フラグメントによって保持されている主要な割り当てをクリーンアップすれば、メモリの問題は発生しません。

この質問を参照して ください

編集:フラグメントでsetUserVisibleHintをオーバーライドします。これにより、フラグメントがビューに出入りするとき (たとえば、FragmentA から FragmentB に切り替える PagerAdapter がある場合) に、リソースのセットアップまたはリソースのクリーンアップを行う場所を決定するのに適した場所が得られます。

    public class MyFragment extends Fragment {
  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
      //you are visible to user now - so set whatever you need 
      initResources();
    }

    else { 
     //you are no longer visible to the user so cleanup whatever you need
     cleanupResources();
    }
  }
 }

バックスタックにアイテムを積み重ねているため、少なくともメモリ フットプリントが少しあることが予想されますが、上記の手法でフラグメントが表示されていないときにリソースをクリーンアップすることでフットプリントを最小限に抑えることができます。

于 2016-02-03T09:00:57.887 に答える