2

次のように、ナビゲーション中にフラグメントが置き換えられる FrameLayout を使用したアクティビティがあります。

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

// ...
// fragMap is a HashMap<String,Class<?>> mapping fragments classes
Fragment frag;
Class<?> classa = fragMap.get(s);
frag = (Fragment) classa.newInstance();

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right ,R.anim.slide_in_right, R.anim.slide_out_left);
ft.addToBackStack(null);
ft.replace(R.id.fragcontainer,  frag);
ft.commit();

戻るボタンを押すと、リバース トランザクションが開始され、すべて問題ないように見えます。
アクティビティが作成されると、最初のフラグメント A が読み込まれ、メモリ使用量は ~20mb です。次に、A を B に置き換え、B を C に置き換えると、メモリは ~40mb に増加します。
フラグメント A が表示されるまで [戻る] ボタンを押すと、メモリ使用量が (アクティビティの場合と同様に) ~20mb に戻ると予想されますが、それでも ~40mb のままです。B と C を再度ナビゲートしても、変化せず、それでも 40 MB 程度です。
私は本当にこの動作を理解していません.フラグメントがリークしていた場合、AからB、Cに移動するたびにメモリを上げるべきではありませんか?
また、次の方法でバックスタックをクリアしようとしました:

getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

しかし、何も変わりません。onDestroyまた、戻るときに各フラグメントで呼び出されることを確認し、呼び出されています。

誰かがこれを理解するのを手伝ってくれませんか? 間違ったパターンを使用していますか?

4

1 に答える 1

0

バックスタックの理解については、Android コア エンジニアからのこの SO 回答を参照してください。

于 2014-01-01T06:14:18.683 に答える