Утечка памяти при удалении AllViewsInLayout - PullRequest
0 голосов
/ 19 сентября 2018

Я разрабатываю приложение, которое использует FragmentPagerAdapter для управления фрагментами.Внутри одного из фрагментов я могу сделать следующее:

  • заполнить представление фрагмента динамически созданными компонентами (LinearLayout, ImageView, Button)

  • удалить созданные виды

Однако, когда я пытаюсь удалить виды, можно заметить серьезные утечки памяти.Android Profiler в Android Studio показывает, что большая часть памяти не восстанавливается из раздела «Графика», когда я интенсивно (тестирую продукт) вызываю populateItems () и clearFragment ()

Вот как я динамически создаю компоненты представления внутри фрагмента:

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
{
    ...
    // populate the layouts
    populateItems(view);
    ...
}

// THIS IS THE FUNCTION USED TO POPULATE THE FRAGMENT
public void populateItems(View vw)
{
    LinearLayout horizontalView;
    ImageView faceImg;
    Button renameBtn;

    fragment_id = (LinearLayout)getActivity().findViewById(R.id.fragment_cunoscuti);

    if(fragment_id != null)
    {
        for (int i = 0; i < files.length; i++)
        {
            String imagePath = Constants.getKnownPath() + File.separator + files[i].getName();

            // set the image view
            faceImg = new ImageView(getActivity());
            faceImg.setImageBitmap(FileUtils.getBitmapFromFile(imagePath));
            ....

            // create the button ...
            renameBtn = new Button(getActivity());

            ....
            // create this for some irrelevant reason :)
            horizontalView = new LinearLayout(getActivity());
            ....
            horizontalView.addView(faceImg);
            horizontalView.addView(renameBtn);

            ....
            fragment_id.addView(horizontalView,params);
        }
}

// THIS IS THE FUNCTION USED AT SOME POINT TO CLEAR THE FRAGMENT
public void clearFragment()
{
    if(fragment_id != null)
    {
        for(int x=0;x<fragment_id.getChildCount();x++)
        {
            if(fragment_id.getChildAt(x) instanceof LinearLayout)
            {
                LinearLayout FL = (LinearLayout) fragment_id.getChildAt(x);
                FL.removeAllViewsInLayout();
            }
        }
        fragment_id.removeAllViewsInLayout();
    }

    // added just for tests
    System.gc();
}

В: Я запросил стек-поток для подобных проблем, но не смог решить.Как можно избежать утечек памяти при попытке сохранить функциональность очистки представления фрагментов?

Спасибо.

...