【问题标题】:slow performance and outofmemory exception in some conditions在某些情况下性能缓慢和内存不足异常
【发布时间】:2018-02-27 07:59:37
【问题描述】:

我对 android 有点陌生,正在开发一个有 10 个全屏背景图像视图的应用程序。使用应用程序一段时间后,由于 outOfMemory 异常,它会强制关闭。我从 Photoshop 设计师那里得到了 720 × 1200 像素的每张图片。我没有在 drawable-dpi 文件夹中放置不同大小的图像,因为我对如何缩放感到困惑。我应该把这个 720 × 1200 放在哪里?在哪个可绘制文件夹中?任何帮助或明确的解释将不胜感激。提前Tnx。

【问题讨论】:

  • 正如@Devsil 所说,在不同的文件夹中有不同的图像并不能解决您的问题。问题是您需要将图像缩放到图像视图的大小。将 720x1200 图像加载到内存中,一张图像 ( (720x1200)x4 ) 占用 3.5mb,虽然不多,但您没有提供有关如何呈现图像的任何信息
  • 这些图像只是一些布局的背景,我使用 Imageview 将它们设置在 xml 中,因为它们不会被动态更改。对不起,你说的最后一句话我没听懂。你能解释一下你的意思吗? @tyczj

标签: android user-interface imageview apk


【解决方案1】:

我不认为您正在寻找的解决方案是针对不同的屏幕密度使用不同的可绘制资源文件夹,而是您应该查看此链接:https://developer.android.com/topic/performance/graphics/load-bitmap.html,了解如何在加载位图之前通过降采样更有效地加载位图图像视图并确保释放任何不再使用的位图。

【讨论】:

    【解决方案2】:

    您必须创建不同的尺寸、布局、图像和图标文件来支持所有设备。

    屏幕密度的变化。

    xlarge screens are at least 960dp x 720dp
    large screens are at least 640dp x 480dp
    normal screens are at least 470dp x 320dp
    small screens are at least 426dp x 320dp
    

    制作此布局文件,以便所有设备都相同

    根据设备提供填充、边距、字体和所有属性。

    res/layout/main_activity.xml           # For handsets (smaller than 600dp available width)
    res/layout-sw600dp/main_activity.xml   # For 7” tablets (600dp wide and bigger)
    res/layout-sw720dp/main_activity.xml   # For 10” tablets (720dp wide and bigger)
    

    对于布局

    res/layout/my_layout.xml              // layout for normal screen size ("default")
    res/layout-large/my_layout.xml        // layout for large screen size
    res/layout-xlarge/my_layout.xml       // layout for extra-large screen size
    res/layout-xlarge-land/my_layout.xml  // layout for extra-large in landscape orientation
    

    图片

    res/drawable-mdpi/graphic.png         // bitmap for medium-density
    res/drawable-hdpi/graphic.png         // bitmap for high-density
    res/drawable-xhdpi/graphic.png        // bitmap for extra-high-density
    res/drawable-xxhdpi/graphic.png       // bitmap for extra-extra-high-density
    

    图标

    res/mipmap-mdpi/my_icon.png         // launcher icon for medium-density
    res/mipmap-hdpi/my_icon.png         // launcher icon for high-density
    res/mipmap-xhdpi/my_icon.png        // launcher icon for extra-high-density
    res/mipmap-xxhdpi/my_icon.png       // launcher icon for extra-extra-high-density
    res/mipmap-xxxhdpi/my_icon.png      // launcher icon for extra-extra-extra-high-density
    

    对于启动器图标

    36x36 (0.75x) for low-density
    48x48 (1.0x baseline) for medium-density
    72x72 (1.5x) for high-density
    96x96 (2.0x) for extra-high-density
    180x180 (3.0x) for extra-extra-high-density
    192x192 (4.0x) for extra-extra-extra-high-density (launcher icon only; see note above)
    

    结帐DimensionSupporting Multiple Screens官方文档。

    【讨论】:

    • 这是对支持多屏幕密度的一个很好的解释,但我相信 OP 问题在于加载完整的位图,而不是在完成它们时释放它们。这就是为什么在加载一些应用程序后最终会OOM。
    • 他可以尝试使用 Glide,这个库有时可以帮助您控制图像并且不会出现 OOM
    • Glide、Picasso、Fresco 等。其中任何一个都可以使用(我个人最喜欢的是 Fresco)。如果他试图对位图做的只是他目前正在做的事情,那么使用这些库中的任何一个也可能是矫枉过正。
    • 我已经为 xml 中的所有图像视图设置了背景,因为它是固定的全屏而不是动态的。所以你说的是使用位图来缩放这些图像? @Devsil
    • 是的,我会查看我在答案中发布的链接。这专注于有效地使用位图,即使对于初学者来说也很容易理解/理解。它可能比仅仅在 imageView xml 创建中包含图像需要更多的工作,但最终它是更好的实践,仍然不是大量的工作要完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2012-06-10
    • 2014-07-25
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多