java.lang.OutOfMemoryError加载代号为1的图像

弗朗切斯科·加尔加尼(Francesco Galgani)

此问题仅指代号One。

我有一个FormTabs每个选项卡可以包含任意数量的图像(从Gallery中获取)。

结果:在几张图像(画廊中的八张图像)之后,在我的Android设备上我得到:

java.lang.OutOfMemoryError: Failed to allocate a 5683356 byte allocation with 1845080 free bytes and 1801KB until OOM
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
        at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:737)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:703)
        at com.codename1.impl.android.c.b(AndroidImplementation.java:2037)
        at com.codename1.r.z.a(Image.java:531)
        at cool.teammate.apps.frontend.b.e.a$1.a(BasePageForm.java:208)
        at com.codename1.r.l.b.a(EventDispatcher.java:349)
        at com.codename1.impl.android.c.a(AndroidImplementation.java:7336)
        at com.codename1.impl.android.CodenameOneActivity$6.run(CodenameOneActivity.java:527)
        at com.codename1.r.r.n(Display.java:1298)
        at com.codename1.r.r.l(Display.java:1242)
        at com.codename1.r.r.k(Display.java:1130)
        at com.codename1.r.aq.run(RunnableWrapper.java:120)
        at com.codename1.impl.b$1.run(CodenameOneThread.java:60)
        at java.lang.Thread.run(Thread.java:776)

iOS也崩溃,但我没有日志。

在显示之前(使用FixedSizeButton我在此问题中报告的class),对每个图像进行了缩放有什么建议吗?

我猜想的dispose()方法Image可能有用,但是它写为“除非您知道自己在做什么,否则请不要调用此方法”。这样有问题吗?例如,dispose将图像保存到文件中和/或缩放后是否可以提供帮助

我也认为这System.gc()可能是有用的。

但是,如果很少有照片有问题...那么如何在Form没有此类问题情况下在相册中制作照片呢?将相同的问题加载到一个内部的数百个照片发布InfiniteContainer...

请注意,无论我插入图像的起始icon位置是Button还是a的填充背景,都会发生内存问题Button

谢谢您的建议。

Shai Almog

您不需要致电dispose()gc()进行适当的申请。您正在尝试加载5mb的图像,我假设它是5mb的JPEG。这可能来自9+百万像素的摄像头,这意味着解压缩后的大小约为9 x 4 == 36MB!

因此36 x 8 = 288mb RAM。

    this.image = Image.createImage(this.imageWidth, this.imageHeight, 0xFFdddddd);

什么是imageWidth / Height?

您可能会在这里占用大量RAM ...

    this.setIcon(this.image);

    EasyThread scalingThread = EasyThread.start("FixedSizeButton-ScalingImg-" + fileName);

由于您正在创建多个线程,因此可能一次将所有8个映像都存储在RAM中。

更好的方法是使用一个图像缩放线程。更好的方法是scaled完全避免并使用ImageIO缩放图像而不将其加载到RAM中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章