【问题标题】:how to release memory occupied by bitmaps如何释放位图占用的内存
【发布时间】:2015-03-31 23:12:29
【问题描述】:

我正在创建一个以循环方式显示图像视图的应用程序。它显示设置的图标,例如蓝牙、wifi 等。没有内存不足错误,但完成活动后,应用程序仍然使用大约。根据内存分析器工具,位图上有 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。

我还在使用unbindDrawables 方法销毁onDestroy 中的所有视图:

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。

【问题讨论】:

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


    【解决方案1】:

    您是否遇到 OOM 问题?

    由于您使用的是getDrawable(R.drawable.superAwesomeFractal),Android 会维护位图的缓存——例如,如果您在两个不同的ImageViews 上设置相同的可绘制对象,Android 不会分配两倍的空间。也就是说,由于您没有显式地创建/解码/使用位图,除非您看到诸如 OOM 异常之类的实际问题,否则您不必担心释放它们或回收它们的分配——Android 会为您处理。这就是为什么您在尝试重用回收的位图时遇到异常的原因。

    【讨论】:

    • 好的,所以我不能释放那个内存?但是,我可以减少它消耗的内存吗?如果是,如何?
    • 通过确保使用最佳编码来定制位图(即,如果您不需要 alpha,请不要使用带 alpha 的格式)。尽可能将 pngs 替换为 xml 创建的可绘制对象(如渐变背景)。您可以做的不多:但同样,如果内存占用不会给您带来问题并且不在图表之外,请不要担心内存占用(如果您显示大量图像,15mb 并不是特别重要)。
    猜你喜欢
    • 2023-03-16
    • 2015-10-26
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多