我有一个Android应用程序,可以将大约30个位图加载到内存中。这些是jpg资源,为455x320像素。
这适用于我从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);
我认为此解决方案不会扩展到更多或更大的图像,所以我仍然对其他评论感兴趣。
答案 0 :(得分:0)
好吧,你的解决方案将内存占用减少了一半(RGB_8888上的4个字节到RGB_565上的2个字节)。但这里真正的问题是为什么你需要同时加载所有图像?动态壁纸的平均主屏尺寸为960 x 800,那么加载30 455x320图像的原因是什么?它不适合,即使此解决方案适用于大多数手机,您使用的是大量内存。我建议你使用一个位图池加载图像并回收它。干杯!