我有一个活动似乎正在泄漏内存,如下所示。但是,泄漏金丝雀似乎没有给出任何泄漏或通知。如果我强行执行垃圾回收,那么它几乎什么都不做。
在该活动中,我正在动态创建图像视图和布局,然后将其置于滚动视图中。例子如下:
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;
答案 0 :(得分:1)
永远不要使用应用程序上下文创建视图。您应该使用显示视图的活动的“活动”上下文。那是因为视图的作用域仅限于活动,我不知道那是您的内存泄漏,但这绝对是一个错误,可能导致异常行为。至少其主题和资源可能不正确。