【发布时间】:2017-06-10 12:10:09
【问题描述】:
在 ImageSwitcher 中切换图像时,我遇到了一些 OutOfMemory 崩溃,这种情况非常罕见,但有时会发生(对我来说从来没有,否则我可以调试它哈哈)。
我只有 5 张图片 (PNG),每张图片的大小都在 10-60kb 之间,所以说实话我很惊讶。这是代码:
frameImages = new int[]{R.drawable.f_0, R.drawable.f_1, R.drawable.f_2, R.drawable.f_3, R.drawable.f_4};
...
public void switchImage() {
int frame = getFrame();
int image = frameImages[frame];
// imageSwitcher.startAnimation(getAnimation());
if (frame == 0)
startYAxisRotation(imageSwitcher, 400);
imageSwitcher.setImageResource(image); //CRASHES HERE
}
我做错了吗?
堆栈跟踪:
java.lang.OutOfMemoryError:
at android.graphics.BitmapFactory.nativeDecodeAsset(BitmapFactory.java:0)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:677)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:507)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:872)
at android.content.res.Resources.loadDrawable(Resources.java:3022)
at android.content.res.Resources.getDrawable(Resources.java:1586)
at android.widget.ImageView.resolveUri(ImageView.java:648)
at android.widget.ImageView.setImageResource(ImageView.java:377)
at android.widget.ImageSwitcher.setImageResource(ImageSwitcher.java:41)
at com.myapp.MainActivity$5.switchImage(MainActivity.java:143)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5293)
at java.lang.reflect.Method.invokeNative(Method.java:0)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(NativeStart.java:0)
【问题讨论】:
-
图像大小完全无关紧要。唯一重要的是图像分辨率。那么图像分辨率是多少?
-
还将异常堆栈跟踪放在这里。不仅行号可以帮助修复错误。
-
@VladMatvienko 嗯,很有趣。分辨率确实很高——620x1084。有问题吗?
-
是的,这可能真的是问题所在。那么日志中没有像
failed to allocate xxxx bytes... with xxx until OOM这样的行吗?这些 xxx 数字很重要,因为它们会显示在 Android RAM 中将消耗多少内存,因此我们可以查看它是否太大。作为快速修复,您可以尝试将 Adil 解决方案与 largeHeap 一起使用。 -
也是您尝试执行此操作的实际设备。它有多少 RAM,哪个版本的 Android 以及哪个屏幕分辨率。由于设备上的 Dalv/ART java 虚拟机通常针对特定的 RAM 大小和屏幕分辨率进行优化,如果设备的屏幕分辨率较小,它不会让您加载太大的图像,因为它不需要这样的图像,它会强制你加载预先调整大小的图像。
标签: android out-of-memory imageswitcher