此问题仅指代号One。
我有一个Form
,Tabs
每个选项卡可以包含任意数量的图像(从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
。
谢谢您的建议。
您不需要致电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] 删除。
我来说两句