我正试图从记忆中清除一些观点。
这是情况。 我有一个活动,我称之为A和另一个B.
现在我按下活动A中的一个按钮,该按钮调用活动B,动态创建大量视图 在此之后,我按回按钮返回活动A. 多次重复这两步。
结果是,在DDMS中,对象和内存的数量分配的静止图像增长(对象数量增加了88,分配了0,002MB) 这意味着不要从内存中删除视图!
如何从内存中完全清除视图?
Thx!
更新 - 在这里,您可以获得一些新信息
基本上,在我的“真实世界”中,我只创建了一个很多次的Activity。发生这种情况是因为我必须与Web服务进行通信,并且所有响应都是在此活动的新实例中创建的。
我尝试使用下面的代码解决此问题
@Override
protected void onDestroy() {
super.onDestroy();
nullViewDrawablesRecursive(mRootView);
mRootView = null;
System.gc();
}
那是我的nullViewDrawablesRecursive
private void nullViewDrawablesRecursive(View view) {
if (view != null) {
try {
ViewGroup viewGroup = (ViewGroup) view;
int childCount = viewGroup.getChildCount();
for (int index = 0; index < childCount; index++) {
View child = viewGroup.getChildAt(index);
nullViewDrawablesRecursive(child);
}
} catch (Exception e) {
}
nullViewDrawable(view);
}
}
那是我的nullViewDrawable
private void nullViewDrawable(View view) {
try {
view.setBackgroundDrawable(null);
} catch (Exception e) {
}
try {
ImageView imageView = (ImageView) view;
imageView.setImageDrawable(null);
imageView.setBackgroundDrawable(null);
} catch (Exception e) {
}
}
基本上我想在销毁活动之前从其父级(mRootView)中删除所有视图和子级。它工作得很好,如果我不这样做,对象和内存使用量会越来越多。
关键是,它并不完美,显然某些类型的观点不会被破坏。而且我认为我正在“重新发明轮子”,似乎很难做到一件简单的事情!
再次,非常感谢您帮助我!
答案 0 :(得分:2)
通常,您无需担心从内存中清除视图。您可以让虚拟机和Android框架在必要时处理此问题。但是,您确实需要关注内存泄漏。如果您的活动正在共享/保持对视图的引用,并且它们不能被垃圾收集,则这是一个问题。您可以从这里开始阅读:http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
虽然没有看到你的代码,但很难提供一些更具体的建议......
答案 1 :(得分:1)
在onDestroy()中,将视图设置为null并调用垃圾收集器。
@Override
public void onDestroy() {
super.onDestroy();
myView = null;
System.gc();
}
这可以通过调用System.gc()来帮助垃圾收集器,但不能保证内存被清除。但是,只要你没有泄漏,就不会有问题。