我有什么
我有一些应用程序包含一些活动。每个活动都有一些EditTexts,ImageViews,ImageButtons,并且也可以访问SharedPreferences。
我的问题
每当我从一个活动移动到另一个活动时,例如从启动画面到登录屏幕再到主活动,我的堆大小会大量增加。由于OutOfMemory错误,它甚至达到了142 MB并且我的应用程序在许多设备上崩溃。
我已经完成了什么
我已经在onPause()方法中对null进行了所有引用,并且它在一定程度上减小了堆大小,但仍然大约为80 MB。我怀疑主要的问题是drawables,因为我也有错误。
请帮我解决一些问题。我该怎么做才能减少内存使用量?
答案 0 :(得分:2)
首先,我强烈建议您使用MAT来分析堆的内容。 http://android-developers.blogspot.be/2011/03/memory-analysis-for-android.html
请确保您提供足够的版本和尺寸的绘图(mdpi,hdpi,xhpdi ...)
答案 1 :(得分:1)
如果您确定所有引用都在java端设置为null,那么它们可能与Drawables有关,我发布一个简单的解决方案只是将该代码放入您的活动类中然后onDestroy调用该代码它将释放drawables占用的所有记忆。
protected void unbindDrawables(View view) {
if (view != null) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
}
如何使用此方法。 查看rootView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
rootView = getLayoutInflater().inflate(R.layout.splashactivity,
null);
setContentView(rootView);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(rootView);
rootView = null;
System.gc();
}