Может ли создание изображений с помощью getApplicationContext () привести к утечкам памяти? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть активность, которая, кажется, утечка памяти, как показано ниже. Тем не менее, утечка канарейка, похоже, не дает никаких утечек или уведомлений. Если я форсирую сборку мусора, это почти ничего не делает.

memory leak

В упражнении я динамически создаю изображения и макеты изображений, а затем помещаю их в вид прокрутки. Пример этого ниже:

dynamicUI = new DynamicUI(getApplicationContext());

TextView textViewTitle = dynamicUI.headerTextView(exercises[i].name);

// Horizontal layout with tools icon and exercise time text
LinearLayout layoutTime = new LinearLayout(new ContextThemeWrapper(this, R.style.exercise_info_layout), null, 0);
layoutTime.addView(dynamicUI.iconImage(R.drawable.tools_icon));
layoutTime.addView(dynamicUI.captionTextView(exercises[i].time));
layoutTime.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);

DynamicUI - это класс, который я написал для генерации представлений одинаково во всем приложении. Вот пример метода:

    public ImageView iconImage(int id){
    ImageView imageView = new ImageView(new ContextThemeWrapper(context, R.style.ButtonImageSmall));
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams((int) (50 * scale), (int) (50 * scale));
    lp.setMargins((int) (10*scale), (int) (10*scale), (int) (10*scale), (int) (10*scale));
    imageView.setLayoutParams(lp);
    imageView.setImageDrawable(context.getResources().getDrawable(id));
    return imageView;
    }

Есть несколько видов, которые я добавляю к потомку прокрутки:

LinearLayout layoutVertical = dynamicUI.exerciseContainer();
layoutVertical.addView(textViewTitle);
layoutVertical.addView(imageViewCover);
layoutVertical.addView(layoutTime);
layoutVertical.addView(layoutDiff);
scrollLayoutChild.addView(layoutVertical);

Существует довольно много таких раскладок, 1-5 или около того. Они генерируются из базы данных SQLite:

DatabaseHelper db = new DatabaseHelper(getApplicationContext());

Я пытался передать null обоим объектам db и dynamicUI в конце onCreate (), и он, похоже, ничего не делает:

// stop memory leak?
dynamicUI = null;
db = null;

1 Ответ

1 голос
/ 18 марта 2019

Вы никогда не должны использовать контекст приложения для создания представлений.Вы должны использовать контекст действия действия, которое отображает представление.Это потому, что представления ограничены активностью. Я не знаю, что это утечка памяти, но это определенно ошибка, которая может привести к странному поведению.Как минимум, его темы и ресурсы могут быть неверными.

...