Heim  >  Fragen und Antworten  >  Hauptteil

android - Warum führt das wiederholte Ersetzen von Fragmenten zu Speicherverlusten?

Wie im Bild gezeigt, wenn auf die beiden Schaltflächen unten geklickt wird, REPALCEEs gibt oben zwei Fragmente, und beim wiederholten Wechseln ist ein Speicherverlust aufgetreten

Dies ist der Code für das Fragment:

public class Fragment2 extends Fragment {

    private List<Bitmap> lb = new ArrayList<>();

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        allocBitMap();
        allocBitMap();
        return inflater.inflate(R.layout.f2, container, false);
    }

    private void allocBitMap() {
        Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.men);
        lb.add(b);
    }

    @Override
    public void onDestroy() {
        Log.e("onDestroy", "yes, onDestroy");
        super.onDestroy();
    }
}

Dies ist Teil des Aktivitätskodex

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_left:
                transFragleft();
                break;
            case R.id.bt_right:
                transFragright();
                break;
        }
    }

    Fragment f1 = new Fragment1();
    Fragment f2 = new Fragment2();

    private void transFragleft(){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.rl_f, f1);
        ft.commit();
    }

    private void transFragright(){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.rl_f, f2);
        ft.commit();
    }

Dies ist der Speicherstatus beim wiederholten Umschalten:

Das ist LOGCAT. Sie können sehen, dass onDestroy ausgeführt wird und der gesamte Fragment-Lebenszyklus sofort beendet ist

04-27 09:46:04.682 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy
04-27 09:46:06.344 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy
04-27 09:46:07.895 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy

Warum ist die Erinnerung, die er innehatte, immer noch da?

Frage 2:
Wie ordne ich in JAVA eine bestimmte Menge Speicher für Experimente zu?

Frage 3:

Sollten wir die Verwendung von FRAGMENT vermeiden (ich weiß, dass die Verwendung von HIDE/SHOW besser ist als REPLACE
).

Danke!

漂亮男人漂亮男人2683 Tage vor611

Antworte allen(2)Ich werde antworten

  • 世界只因有你

    世界只因有你2017-05-16 13:34:31

    把LeakCanary集成到代码里面,看看是什么原因导致的内存泄露。
    而且内存图上升,也不一定就是内存泄露。你每次申请了Bitmap,没准没达到GC的标准,那内存一直上涨也没问题。

    Antwort
    0
  • 某草草

    某草草2017-05-16 13:34:31

    不是 fragment 的问题,而是你用的bitmap 的原因

    Antwort
    0
  • StornierenAntwort