这个问题仅指代号一。
我有一个带有Tabs
的Form
,每个选项卡可以包含任意数量的图像(取自图库(。
结果:在几张图片(图库中的八张图片(之后,在我的 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
的dispose()
方法可能很有用,但它被写成"除非你知道你在做什么,否则不要调用此方法"。有那么大问题吗?例如,如果我在将图像保存到文件和/或缩放后dispose
图像,会有所帮助吗?
我也猜System.gc()
是有用的。
但是,如果很少有照片如此成问题......如何在没有此类问题的情况下在Form
内制作照片库?在InfiniteContainer
内加载数百个照片帖子同样的问题......
请注意,无论我插入图像是作为Button
的icon
还是作为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 中。