Codenameone java.lang.OutOfMemoryCodeName One中加载图像时出错
这个问题只涉及代号1 我有一个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
表单
和一个选项卡
,每个选项卡可以包含任意数量的图像(从图库中获取)
结果:在几张图片(画廊中的八张图片)之后,在我的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中