【问题标题】:OutOfMemory errors with Bitmap on LiveWallpaper on Galaxy NexusGalaxy Nexus 上 LiveWallpaper 上的位图出现 OutOfMemory 错误
【发布时间】:2012-02-11 23:10:19
【问题描述】:

我有一个 Android 应用程序,它会将大约 30 个位图加载到内存中。这些是 455x320 像素的 jpg 资源。

这适用于我测试过的所有设备,从 G1 到 Galaxy Nexus。

我有这个应用程序的另一个版本,它是 LiveWallpaper。它适用于 Nexus One、Milestone、Galaxy S2 和一些 3.x 平板电脑。但是,我的应用程序的 LWP 版本仅在 Galaxy Nexus(在 ICS 上)上崩溃并出现 OutOfMemory 错误。

以下是我正在使用的代码的简化版本:

Bitmap bitmap = BitmapFactory.decodeResource(
  lwpService.getResources(), R.drawable.somepic);
imageCache.put(R.drawable.somepic, bitmap);
bitmap = BitmapFactory.decodeResource(
  lwpService.getResources(), R.drawable.someotherpic);
imageCache.put(R.drawable.someotherpic, bitmap);
… // and so on for 30 more images.

这是来自 logcat 的堆栈跟踪:

02-12 00:07:34.456 E/dalvikvm-heap( 6938): Out of memory on a 583696-byte allocation.
02-12 00:07:34.456 I/dalvikvm( 6938): "Thread-7378" prio=5 tid=16 RUNNABLE
02-12 00:07:34.456 I/dalvikvm( 6938):   | group="main" sCount=0 dsCount=0 obj=0x4186c3f8 self=0x20e538
02-12 00:07:34.456 I/dalvikvm( 6938):   | sysTid=7115 nice=0 sched=0/0 cgrp=default handle=2213784
02-12 00:07:34.456 I/dalvikvm( 6938):   | schedstat=( 0 0 0 ) utm=6907 stm=504 core=1
02-12 00:07:34.456 I/dalvikvm( 6938):   at android.graphics.Bitmap.nativeCreate(Native Method)
02-12 00:07:34.456 I/dalvikvm( 6938):   at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
02-12 00:07:34.456 I/dalvikvm( 6938):   at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
02-12 00:07:34.456 I/dalvikvm( 6938):   at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
02-12 00:07:34.456 I/dalvikvm( 6938):   at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
02-12 00:07:34.456 I/dalvikvm( 6938):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
02-12 00:07:34.456 I/dalvikvm( 6938):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
02-12 00:07:34.456 I/dalvikvm( 6938):   at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:374)
02-12 00:07:34.463 I/dalvikvm( 6938):   at com.myapp.loadImage(MyApp.java:155)

是否有其他人在 Galaxy Nexus 上的 LWP 中将多个位图加载到内存中时遇到问题?

编辑: 我找到了一种避免 OutOfMemoryErrors 的方法:因为我的特定图像是不透明的,所以我不需要 alpha 通道,所以我可以使用 Bitmap.Config.RGB_565 而不是 Bitmap.Config.RGB_8888。这样,我的图像使用的内存是以前的一半。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;    
Bitmap bitmap = BitmapFactory.decodeResource(
    lwpService.getResources(), R.drawable.somepic, options);

我认为这个解决方案不会扩展到更多或更大的图像,所以我仍然对其他 cmets 感兴趣。

【问题讨论】:

    标签: android out-of-memory live-wallpaper android-4.0-ice-cream-sandwich


    【解决方案1】:

    嗯,您的解决方案将内存占用减少了一半(RGB_8888 上的 4 个字节到 RGB_565 上的 2 个字节)。但这里真正的问题是为什么你需要同时加载所有图像?动态壁纸上的平均主屏幕尺寸为 960 x 800,那么加载 30 个 455x320 图像的原因是什么?它不适合,即使此解决方案适用于大多数手机,您也正在使用大量内存。我建议您使用位图池动态加载图像并回收它。干杯!

    【讨论】:

    • 320x455分辨率图片的原因是这本来是G1上的一个应用,后来我改编成了动态壁纸。有 30 张图像的原因是它们用于各种动画。我尝试不加载和缓存它们,但动画变得很慢。我尝试只加载和缓存给定动画的特定图像,但仍然出现 OOM 错误。恐怕对于图像池,可能很难找到最佳尺寸:太大会出现 OOM 错误,太小会导致动画不连贯。
    • 我可能有办法优化我的代码(除了我已经找到的解决方案)。但令我困惑的是,相同的逻辑适用于 2.x 和 3.x,但不适用于 4.x。
    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多