【问题标题】:How image resources are recycled?图片资源如何回收?
【发布时间】:2012-08-03 18:15:36
【问题描述】:

通常我总是在Imageviews 中使用Drawable 资源,因为我没有手动释放它们。

但在某些情况下,我需要动态创建位图,然后在onDestroy() 中手动调用recycle()。这是我根据that other StackOverflow question找到的最佳解决方案。

我想了解 Android 是如何管理 Drawable 资源的,以及为什么我没有手动回收它们。并且当了解后,看看是否可以将类似的逻辑应用于手动创建的位图。

【问题讨论】:

    标签: android android-imageview android-memory


    【解决方案1】:

    DrawableBitmap 更广泛。 Drawable 旨在表示图形系统可以渲染到显示器的任何内容。 Drawable 的子类(例如 ShapeDrawableColorDrawable)不包含 Bitmaps,因此不需要任何类型的手动内存管理。

    BitmapDrawable 包装 Bitmap 并包含对 Bitmap 的引用。 Bitmap 很特别,因为 Android 将所有 Bitmaps 的像素数据保存在一个单独的堆中,该堆与应用程序的其余部分分开管理。当 Android 垃圾收集器清理 Bitmap 对象时,它还会清理位图堆中的像素数据。但是您可以通过在Bitmap 上手动调用recycle() 来强制它更快发生,这会将Bitmap 标记为无效并释放其像素数据。

    Android 为每个正在运行的应用程序分配一个固定大小的位图堆,您的应用程序可能会因为同时使用过多的Bitmaps 而耗尽其堆。这就是为什么如果您的应用程序广泛使用位图,一旦您知道不再需要位图,您可能会从回收位图中受益。

    更新:如 cmets 中所述,单独的位图堆适用于 Honeycomb 之前的 Android 版本。从 Honeycomb 开始,位图堆与应用程序堆合并。这是SO post with more info

    【讨论】:

    • 那么如果我理解正确的话,就会有任何“魔法”。如果我在 onCreateView 之后手动创建 Bitmap 并在 Imageview 上设置,我可以预期 Android 会以与释放图像资源创建的相同的方式释放它?
    • 只要您的 Activity 没有对手动创建的 Bitmap 进行任何引用(例如,在静态字段或其他内容中),它就会被垃圾收集器连同所有其他内容一起清理的视图对象。如果您知道不再需要位图,并且想为其他用途释放位图堆,则 recycle() 方法很有用。
    • 这虽然是 pre-honeycomb,但由于 honeycomb 位图内存与应用程序的其余部分在同一个堆中。
    • @lxx - 我隐约意识到这种变化;谢谢指正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2019-10-19
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多