我的Android应用程序占用了太多内存

时间:2014-07-29 12:51:57

标签: android android-activity memory-leaks heap

我有什么

我有一些应用程序包含一些活动。每个活动都有一些EditTexts,ImageViews,ImageButtons,并且也可以访问SharedPreferences。

我的问题

每当我从一个活动移动到另一个活动时,例如从启动画面到登录屏幕再到主活动,我的堆大小会大量增加。由于OutOfMemory错误,它甚至达到了142 MB并且我的应用程序在许多设备上崩溃。

我已经完成了什么

我已经在onPause()方法中对null进行了所有引用,并且它在一定程度上减小了堆大小,但仍然大约为80 MB。我怀疑主要的问题是drawables,因为我也有错误。

请帮我解决一些问题。我该怎么做才能减少内存使用量?

2 个答案:

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

}