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

问题描述 投票:0回答:1

我有一项似乎在泄漏记忆的活动,如下所示。但是,泄漏的金丝雀似乎没有任何泄漏或通知。如果我强制垃圾收集它几乎什么也没做。

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()的末尾为我的db和动态UI对象分配null,它似乎没有做任何事情:

// stop memory leak?
dynamicUI = null;
db = null;
android memory-leaks imageview profiler
1个回答
1
投票

您永远不应该使用应用程序上下文来创建视图。您应该使用显示视图的活动的Activity上下文。那是因为视图的范围是我不知道那是你的内存泄漏的活动,但它绝对是一个可能导致奇怪行为的错误。至少其主题和资源可能不正确。

© www.soinside.com 2019 - 2024. All rights reserved.