【问题标题】:When can I recycle a Bitmap?我什么时候可以回收位图?
【发布时间】:2013-07-31 14:34:40
【问题描述】:

我有严重的内存问题,我期待回收位图。

但是,我的应用正在使用 atm 构建一个包含多个位图的画廊(是的,已弃用),然后是多个画廊。

所以在一天结束时,应用看起来像(LinearLayout 样式):

*一些网页浏览量 *包含 7 张图片的画廊。 *一些网页浏览量 *一个有 10 张图片的画廊

等等。

所以我的想法是......一旦我显示了这些图像,并且它们在屏幕上,这些位图可以回收吗?

有没有办法回收整个图库组件?

非常感谢。

编辑:

我尝试了很多东西。我仍然收到错误java.lang.IllegalArgumentException: bitmap size exceeds 32bits

这是我的实际代码:

BitmapFactory.Options bfOptions=new BitmapFactory.Options(); 
        bfOptions.inDither=false;          //Disable Dithering mode
        bfOptions.inPurgeable=true;       //Tell to gc that whether it needs free memory, the Bitmap can be cleared
        bfOptions.inInputShareable=true;  //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
        bfOptions.inTempStorage=new byte[32 * 1024]; 
        bfOptions.inInputShareable=true;
        bfOptions.inPreferredConfig = Bitmap.Config.RGB_565;    



        Bitmap bitmap = BitmapFactory.decodeFile(mUrls.get(position).getPath(), bfOptions);

        inflatedImageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 120, 120, false));

如您所见,我为位图设置了许多选项,并调整了它的大小并降低了它的质量。仍然发生同样的问题。

【问题讨论】:

  • 为什么不用ViewPager来实现图库呢?这是 Google 找到的链接:manishkpr.webheavens.com/…
  • 上次我使用这个时,一旦位图不再可见,您必须一次回收一个位图。
  • @gunar 因为编辑整个应用程序需要很长时间。我需要一种释放内存的方法。
  • 还不错...所以:首先,您确定要加载最适合尺寸的图像吗?我的意思是你在做一些样本大小的解码吗?就像这篇文章中描述的那样:developer.android.com/training/displaying-bitmaps/index.html 然后,只有当imageview不再附加到视图时,才可以安全地回收位图。
  • 是的,位图总是被调整为 150x150。当我执行 System.gc 时,它是否也会自动“清理”位图?

标签: android


【解决方案1】:

首先你不应该手动调用system.gc,通常也不需要手动回收位图。让操作系统尽其所能,决定何时运行垃圾回收。

画廊被弃用的原因之一是我相当确定它会在渲染后立即加载所有项目。并且不会像列表视图那样按需加载和回收它们。这意味着这是对 RAM 的巨大浪费,再多的回收也无济于事。此外,Gallery 在 4.0+ 的手机上非常有问题,目前这是大多数 Android 用户群。我强烈建议您不要使用图库。

有两种选择。

1) View Pager 现在内置在 Support V4 库中

2) Horizo​​ntalListView --> https://github.com/MeetMe/Android-HorizontalListView

还要确保在将所有图像加载到图像视图之前对它们进行下采样。了解如何阅读http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

【讨论】:

  • 将尝试使用 ViwePager,因为这开始很烦人。您可以提供有关 View Pager 的任何教程吗?顺便问一下,ViewPager > 3.0可以用吗?我正在为高于或等于 3.0 的目标进行开发。
  • 我已经检查了 ViewPager,但我不确定它是否是我需要的。它是显示图像,但不会同时显示很多图像。这就是我所说的:i.imgur.com/nfsukyA.png我需要你在图像中看到的东西。一个带有背景颜色的“容器”,同时可以看到多个图像,如果还有更多,您可以在它们之间进行扫描。
  • Horizo​​ntalListView 是你想要使用的。
【解决方案2】:

好的。我解决了我遇到的问题;我有一个带有画廊组件和网络视图的线性布局。如果我不渲染 webview,应用程序不会崩溃。

所以经过一些调整,现在它可以正常工作而不会崩溃:

wv_detail.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);      
wv_detail.setLayerType(View.LAYER_TYPE_NONE, null);

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 2013-08-16
    • 2015-04-06
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2015-02-10
    • 1970-01-01
    相关资源
    最近更新 更多