2012-02-11 68 views
3

我有一个Android应用程序将大约30位图加载到内存中。这些是455x320像素的jpg资源。Galaxy Nexus上的LiveWallpaper上的Bitmap出现OutOfMemory错误

这适用于我测试过的所有设备,从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上?

编辑: 我已经找到一种方法避免OutOfMemoryError异常:因为我具体的图像是不透明的,我并不需要一个alpha通道,所以我可以用它代替Bitmap.Config.RGB_8888 Bitmap.Config.RGB_565。这样,我的图像像以前一样使用了一半的内存。

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

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

回答

0

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

+0

分辨率为320x455的图像的原因是,它原本是G1上的一个应用程序,我后来改编为动态壁纸。 有30张图片的原因是它们被用在各种动画中。我尝试不加载和缓存它们,但动画变得非常缓慢。我只尝试加载和缓存给定动画的特定图像,但仍有OOM错误。恐怕有了一堆图像,可能很难找到最佳尺寸:太大,我会得到OOM错误,太小,我会有动荡不安的动画。 – Carmen 2012-02-12 22:56:48

+0

我可能有一种方法来优化我的代码(除了我已经找到的解决方案之外)。但令我费解的是,相同的逻辑适用于2.x和3.x,但不适用于4.x. – Carmen 2012-02-12 23:00:07

相关问题