android - Why does repeated Replace Fragment leak memory?
漂亮男人
漂亮男人 2017-05-16 13:32:31
0
2
677

As shown in the figure, when the two buttons below are clicked, REPALCEThere are two Fragmnets above, and a memory leak occurs when switching repeatedly

This is the code of 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();
    }
}

This is part of the activity code

    @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();
    }

This is the memory status when switching repeatedly:

This is LOGCAT. You can see that onDestroy is executed and the entire Fragment life cycle ends immediately

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

So why is the memory he occupied still there?

Question 2:
How to allocate a certain amount of memory in JAVA for experiments? My bitmap method is too low, and there is CONTEXT in it;

Question 3:
Should we avoid using FRAGMENT (I know that using HIDE/SHOW is better than REPLACE

Thanks!

漂亮男人
漂亮男人

reply all(2)
世界只因有你

Integrate LeakCanary into the code to see what causes the memory leak.
And if the memory graph rises, it does not necessarily mean a memory leak. Every time you apply for a Bitmap, it may not meet the GC standards, so it’s no problem if the memory keeps increasing.

某草草

It’s not the fragment’s problem, it’s the bitmap you use

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template