java.lang.OutOfMemory在代号一中加载图像时出错



这个问题仅指代号一。

我有一个带有TabsForm,每个选项卡可以包含任意数量的图像(取自图库(。

结果:在几张图片(图库中的八张图片(之后,在我的 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,我在这个问题中报告(。有什么建议吗?

我想Imagedispose()方法可能很有用,但它被写成"除非你知道你在做什么,否则不要调用此方法"。有那么大问题吗?例如,如果我在将图像保存到文件和/或缩放后dispose图像,会有所帮助吗?

我也猜System.gc()是有用的。

但是,如果很少有照片如此成问题......如何在没有此类问题的情况下在Form内制作照片库?在InfiniteContainer内加载数百个照片帖子同样的问题......

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

谢谢你的建议。

您无需调用dispose()gc()即可获得正确的应用程序。您正在尝试加载一个 5mb 的图像,我假设它是一个 5mb 的 JPEG。这可能是来自 9+ 百万像素相机,这意味着解压缩的大小大约为 9 x 4 == 36MB!

所以 36 x 8 = 288mb 的内存。

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

什么是图像宽度/高度?

您可能在这里占用了大量内存...

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

由于您正在创建多个线程,因此您可能同时在 RAM 中拥有所有 8 个图像。

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

最新更新