使用getApplicationContext()创建imageview会导致内存泄漏吗?

时间:2019-03-18 05:32:34

标签: android memory-leaks imageview profiler

我有一个活动似乎正在泄漏内存,如下所示。但是,泄漏金丝雀似乎没有给出任何泄漏或通知。如果我强行执行垃圾回收,那么它几乎什么都不做。

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;
    }

我将几个视图添加到scrollview的子视图中:

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

我曾尝试在onCreate()的末尾同时向我的数据库和dynamicUI对象添加null,但它似乎没有任何作用:

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

1 个答案:

答案 0 :(得分:1)

永远不要使用应用程序上下文创建视图。您应该使用显示视图的活动的“活动”上下文。那是因为视图的作用域仅限于活动,我不知道那是您的内存泄漏,但这绝对是一个错误,可能导致异常行为。至少其主题和资源可能不正确。