【问题标题】:Samsung devices requiring large heap size in Android在 Android 中需要大堆大小的三星设备
【发布时间】:2014-03-06 14:30:52
【问题描述】:

我创建了一个 Android 游戏,它使用了一些全屏位图 (4 @ 800x480) 和 10 个 Sprites (大约 80x80),所以它不是特别大。该游戏在具有 100mb 免费内存和 25mb 免费存储的旧 HTC Desire 上运行得非常好。它还可以在几款高端 HTC 手机、摩托罗拉 XOOM 平板电脑、Nexus 5、Nexus 7 和几款爱可视/Arnova 平板电脑上正常运行。但是,当我在三星设备(目前是三星 Galaxy Tab 2.0)上运行它时,它会在代码的位图加载区域出现内存不足错误,只能通过在 android manifest xml 中将大堆请求设置为 true 来解决太离谱了,因为除非我在 Play 商店中创建单独的应用程序,否则必须在所有设备上进行设置)。我最初认为这可能是由于从可绘制区域加载的图像,所以将其更改为资产,但没有区别。其他人遇到过这个问题并找到了解决方法吗?

失败的行是:-

retBitmap = BitmapFactory.decodeStream(res.getAssets().open(name+".png"));

retBitmap = BitmapFactory.decodeResource(res, res.getIdentifier(name, "drawable", con.getPackageName()));

根据我是从资产加载还是从可绘制对象加载,我之前也尝试过使用此选项:-

BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true;

但这没什么区别。有什么想法吗?

【问题讨论】:

    标签: android bitmap out-of-memory


    【解决方案1】:

    使用options.inSampleSize = 2

    【讨论】:

    • 你能解释一下这是做什么的吗?
    • 如果设置为> 1的值,则请求解码器对原始图像进行二次采样,返回较小的图像以节省内存。样本大小是对应于解码位图中的单个像素的任一维度中的像素数。例如,inSampleSize == 4 返回的图像是原始宽度/高度的 1/4,像素数的 1/16。任何
    • 您可以将其编辑回您的答案吗?通常,不鼓励仅使用代码的答案,因为它们不能帮助查看者理解如何使用它,除非它非常明显。上面的解释很有帮助,应该是答案的一部分。
    • 刚刚尝试了您的建议,但在位图加载时仍然出现内存不足错误。无论如何精灵都非常​​小,4 个背景只有 800x480,它们不应该需要采样。
    • 尝试 developer.android.com/training/displaying-bitmaps/… 但首先尝试 inSampleSize = 4
    【解决方案2】:

    尝试在单个 UI 事件中加载您的位图。 正如我所检查的 - android 可以增加 UI 事件之间的应用程序堆大小。

    您可以使用一些自定义解决方案以异步方式实现 应用程序数据初始化 实体并显示一些初始化屏幕(例如带有一些动画) - 常见做法。

    例如,您可以使用 Runnable 序列来加载一组位图,并在加载最后一个资源后通知应用程序您的应用程序数据加载完成事件

    initHandler.post(new Runnable() {
        void run() {
        /* load bitmap */
        /* post new runnable if not all bitmaps loaded */
        /* in  other case notify user about loding finished */
    });
    

    要检查这种方法 - 使用下一个命令并分析 本机堆大小

    adb shell dumpsys meminfo com.your.package.name
    

    您可能知道 - android 将位图数据存储在 本机缓冲区(从某些版本开始)。

    我相信异步位图加载可能会解决您的问题。

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 2012-12-23
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多