Codenameone java.lang.OutOfMemoryCodeName One中加载图像时出错

Codenameone java.lang.OutOfMemoryCodeName One中加载图像时出错,codenameone,Codenameone,这个问题只涉及代号1 我有一个表单和一个选项卡,每个选项卡可以包含任意数量的图像(从图库中获取) 结果:在几张图片(画廊中的八张图片)之后,在我的Android设备上,我得到: java.lang.OutOfMemoryError: Failed to allocate a 5683356 byte allocation with 1845080 free bytes and 1801KB until OOM at dalvik.system.VMRuntime.newNonMo

这个问题只涉及代号1

我有一个
表单
和一个
选项卡
,每个选项卡可以包含任意数量的图像(从图库中获取)

结果:在几张图片(画廊中的八张图片)之后,在我的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
)。有什么建议吗

我想
Image
的方法可能很有用,但它写的是“除非你知道你在做什么,否则不要调用这个方法”。有问题吗?例如,在将图像保存到文件和/或缩放后,如果我处置图像,是否会有所帮助

我还认为
System.gc()
可能很有用

然而,如果很少有照片有问题的话。。。如何在
表单
中创建照片库而不出现此类问题?在一个
InfiniteContainer
中加载数百张照片也是同样的问题

请注意,无论我是将图像作为
按钮的
图标插入还是作为
按钮的填充背景插入,内存问题都会发生


谢谢您的建议。

您不需要调用
dispose()
gc()
来获得正确的应用程序。您正在尝试加载5mb图像,我假设它是5mb JPEG。这可能是一个900万像素的相机,这意味着解压后的大小大约是9x4==36MB

因此,36 x 8=288mb的RAM

    this.image = Image.createImage(this.imageWidth, this.imageHeight, 0xFFdddddd);
图像的宽度/高度是多少

你可能在这里带了很多羊

    this.setIcon(this.image);

    EasyThread scalingThread = EasyThread.start("FixedSizeButton-ScalingImg-" + fileName);
由于您正在创建多个线程,所以可能会同时在RAM中创建所有8个映像

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