【问题标题】:xml images are taking up too much memory - androidxml 图像占用太多内存 - android
【发布时间】:2015-11-17 19:50:23
【问题描述】:

嗨,我是 android 新手,在使用 xml 定位和设计我的活动布局时遇到了一些内存管理问题。 大多数图像大约 100kb,但大小不同,例如图片 1 为 512x512,图片 2 为 120x320 等等。 目前图像正在减慢我的应用程序的性能,有时会崩溃。 有没有办法减少图像在应用上占用的内存量?

【问题讨论】:

  • 我认为您需要使用 TinyJPG 等工具优化图像
  • 对不起,我忘了说我已经将它应用于图像了
  • 垃圾收集器从我的 logcat 中做的太多了,它说它的可用空间很少

标签: android image image-processing memory-management android-xml


【解决方案1】:

应用程序必须经过许多步骤才能正常处理位图。

  • 小压缩尺寸。平衡磁盘(或在线)格式的质量与文件大小很重要。能够通过有损预处理器运行 PNG 文件,或者在需要时选择使用 WEBP/JPG,这对于应用程序中的每个图像都至关重要。 Smaller PNG Files 对此进行了更多介绍。然而,这里的问题是这对内存大小没有帮助。请记住,当您的图像从磁盘加载时,它们会在内存中解压缩为每像素 32 位(换句话说,没有压缩)。

  • 在内存格式中压缩。Android 提供了备用 565 格式,它每像素仅使用 16 位,而不是 8888 格式的 32 位。如果您使用的是不需要 alpha 的图像,您应该考虑在Smaller Pixel Formats 中讨论的过程,以利用将位图加载为 565。

  • 重新使用位图空间。大多数使用缩略图的应用程序,一次只有 10-20 个在屏幕上可见(即使可能有数千个要加载)。 Re-using bitmaps 中描述了这里的技巧。基本上,一旦不再需要缩略图,您就可以将其空间重新用于传入的缩略图,而不是分配一个全新的缩略图。

  • 显示分辨率。加载 2MB 的图像,仅将其显示为缩略图是没有意义的。相反,您应该将图像缩放到它将在设备上显示的分辨率。我在other SO post 中讨论了加载这些图像的最有效方法。

一般来说,像PicassoGlide 这样的库在提供使这一切变得更容易的API 方面做得很好;但他们仍在幕后经历这些相同的过程。

【讨论】:

    【解决方案2】:

    您有 3 个解决方案可以做:

    第一种解决方案:

    在您的应用程序标签中添加您的 AppManifest.xml:

    android:largeHeap="true"
    

    这将尝试防止您的应用导致 OutOfMemoryError,但请谨慎使用。

    文档:是否应使用大型 Dalvik 堆创建应用程序的进程。这适用于为应用程序创建的所有进程。它仅适用于加载到进程中的第一个应用程序;如果您使用共享用户 ID 来允许多个应用程序使用一个进程,则它们都必须一致地使用此选项,否则它们将产生不可预知的结果。 大多数应用程序不应该需要这个,而是应该专注于减少它们的整体内存使用以提高性能。启用此功能也不能保证可用内存的固定增加,因为某些设备受到其总可用内存的限制。

    第二个解决方案:

    如果您的图片文件很大,您可以使用此在线工具将其最小化:http://compresspng.com/

    第三种解决方案:

    您可以使用BitmapFactory 来加载图像。这是 Android 开发者文档:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    【讨论】:

    • android:largeHeap="true"。更大的堆会导致更多的时间花在垃圾收集上。谨慎使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2012-05-25
    • 2015-04-13
    • 2015-10-14
    • 2013-07-18
    相关资源
    最近更新 更多