如何释放位图占用的内存

时间:2015-03-31 23:12:29

标签: android memory-management memory-leaks bitmap android-bitmap

我正在创建一个以循环方式显示图像视图的应用。它显示了设置的图标,例如蓝牙,wifi等。没有内存不足错误,但在完成活动后,应用程序仍然使用约。根据Memory Analyzer工具,位图上的15mb RAM。如何,我可以发布这些位图。

以下是创建圆形视图的代码:

    settingsImageViews = new ArrayList<View>(0);

    // create settings icon views
    for (int i = 0; i <= 12; i++) {
        ImageView imageView = new ImageView(this);
        if (i > 2 && i != 10) {
            imageView.setImageDrawable(getSettingsIcon(i - 3));
        } else if (i == 10) {
            imageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_key));
        } else {
            imageView.setImageDrawable(null);
        }

        settingsImageViews.add(imageView);
    }

    settingsCircularView = new CircleView(this, CIRCLE_RADIUS, settingsImageViews);
    parentLayout.addView(settingsCircularView);

对于圆形视图,我正在使用此代码:custom circular view. placing of views

getSettingsIcon方法:

private Drawable getSettingsIcon(int settingId) {
    switch (settingId) {

    case 0:// bluetooth
        if (PhoneSetting.isBluetoothOn())
            return getResources().getDrawable(R.drawable.ic_bluetooth);
        else
            return getResources().getDrawable(R.drawable.ic_bluetooth_off);

    case 1:// wifi
        if (wifiManager.isWifiEnabled())
            return getResources().getDrawable(R.drawable.ic_wifi_on);
        else
            return getResources().getDrawable(R.drawable.ic_wifi_off);
    .
    .
    .
    }
}

我尝试在onDestroy方法中回收位图,但是当我重新打开活动时,由于trying to use a recycled bitmap android.graphics.Bitmap错误而导致崩溃。

我甚至尝试拨打System.gc(),但应用仍然使用15mb RAM。

我也在使用onDestroy方法破坏unbindDrawables中的所有观看次数:

private void unbindDrawables(View view) {       
        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();
        }
}

在尝试了所有上述事情之后,甚至没有减少1 mb。资源也使用约。 4.5 mb。

1 个答案:

答案 0 :(得分:0)

你有OOM问题吗?

由于您正在使用getDrawable(R.drawable.superAwesomeFractal) Android正在维护位图的缓存 - 例如,如果您在两个不同的ImageView上设置相同的drawable,则Android不会分配两倍的空间。也就是说,由于您没有明确创建/解码/使用位图,除非您看到实际问题(如OOM异常),否则您无需担心发布它们或回收它们的分配 - Android将为您处理。顺便提一下,为什么你会尝试重用循环位图这个例外。