【问题标题】:Identical ImageButtons consume huge amount of memory相同的 ImageButtons 会消耗大量内存
【发布时间】:2016-05-14 14:52:29
【问题描述】:

我最近刚开始开发 Android 应用程序并面临内存问题。使用 Android Studio 的分配跟踪功能,我发现显示在多个活动上的四个 ImageButton 最有可能导致问题。分配跟踪结果显示,几乎所有内存都被两种有关图像的方法使用。看: Allocation Tracking result

按钮的可绘制对象是大小约为 20 KB 的小图标,位于 drawable-nodpi 中。这样,Android 就不必对缩放它们做任何事情。 启动应用程序并在显示这四个 ImageButton 的两个活动之间切换几次,就足以运行 OOM。活动通常通过以下方式以特定的 launchMode 启动:

startActivity(new Intent(this, MyActivity.class));

Android 不应该销毁当前未使用的活动以释放内存。相反,我得到了一个不断增加的内存使用图,如下所示:Memory Usage

有哪些好的做法可以降低重复出现的 ImageButton 所需的资源?有没有办法让我在 onDestory() 中明确删除它们?

【问题讨论】:

    标签: android memory-leaks imagebutton


    【解决方案1】:

    no-dpi 表示它不适用于密度缩放,而不是“它永远不会缩放”。

    如果您有 1 个像素 no-dpi 可绘制并以 640x480 显示(缩放为适合或覆盖),android 将在 640 * 480 * 4 字节 = ~1.2 MB 处解码资源。你的似乎在 55 和 35 MB 左右,所以我假设你将它们缩放到整个屏幕,或者至少是大的。

    一遍又一遍地开始一个新的活动只会建立一个堆栈。由于您仍然在同一个任务堆栈中处于活动状态(您只是在它之上添加),Android 不会只是破坏活动;这与转到不同的任务堆栈不同(阅读:启动不同的应用程序,将这个应用程序置于后台)。

    资源回收由ImageButtonButton 类处理,因此您无需显式处理。如果您想手动执行此操作:

    • 不要在布局中为可绘制对象充气(因此请移除 drawableXXX=...src=...
    • 使用Bitmap.decodeResource加载图像
    • 在这里您可以设置小尺寸和BitmapFactory.Options
    • 完成后手动拨打Bitmap#recycle

    如果您在onCreate 中加载这些,请在onDestroy 中回收;如果您在onStart 中加载这些,请在onStop 中回收;如果您在onResume 中加载这些,请在onPause 中回收。

    【讨论】:

    • 与ImageButtons一起使用的图标图像约为600x600,并在屏幕底部并排显示,请参阅:i.imgur.com/VE0hEzX.png由于回收是由ImageButton本身处理的,是这样的只是由于drawables位于错误目录中的问题?
    • 我实际上假设正在发生其他事情。单个按钮的内存使用是荒谬的。老实说,由于这些不是矢量图像(或大背景图像),我会将它们放在 mdpi 中,并让 android 缩放它们的密度。它看起来会更好。
    猜你喜欢
    • 2022-01-16
    • 2014-01-04
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多