2012-02-04 62 views
3

大约一周前,我已将一个新的动态墙纸上传到Android Market上,并且我收到了一些关于java.lang.OutOfMemoryError的报告。位图OutOfMemoryError

这个错误发生在没有足够内存的小型手机上,以我的1115图片作为动态壁纸背景。

我已经尝试过使用inSampleSize,但它会缩小背景以至于当我尝试将其缩小到正常大小时,它都会被设置为pizelated。

有没有人可能有我如何解决这个问题与我的JPG图像的例子?

+0

您应该将您的问题标题更改为动态壁纸中的位图OutOfMemoryError,因为活动wallapaper与普通应用程序不同 – Lumis 2012-02-05 09:20:41

回答

2

我认为slayton的回复可能是第一个要解决的问题,但是您还可以使用inPreferredConfig和任何小于ARGB_8888的内存来节省大量内存。尝试RGB_565:

BitmapFactory.Options bounds = new BitmapFactory.Options(); 
bounds.inPreferredConfig = Bitmap.Config.RGB_565; 
InputStream input = getAssets().open("assets/your-image.jpg"); 
Bitmap bitmap = BitmapFactory.decodeStream(input, null, bounds);  
0

什么手机的显示密度为1115×1000像素?正确的做法是将壁纸缩小至手机显示屏的EXACT尺寸。任何比这更大的东西都是浪费,因为手机会导致内存浪费。

+0

它是为480x800的屏幕尺寸设计的,但由于背景旋转和移动而设计得更大,否则是的,我可以制作它小得多 – Gatekeeper 2012-02-05 02:16:49

+0

然后你可能会考虑只留在需要的壁纸部分。 Big Momo的建议也是一个很好的建议。 – slayton 2012-02-05 02:27:37

+0

现在我正在使用: – Gatekeeper 2012-02-05 03:00:50

1

我在过去的几周里遇到了同样的问题。我可以成功将1900 x 1200位图加载到我的wallaper中,但更改图像会导致出现内存错误。这是因为当你的壁纸运行时,它会创建一个wallaper引擎,如果你进入它的设置,那么很多机器人会创建第二个PREVIEW引擎,所以你的应用程序需要两倍的内存!

当加载新图像时,这与慢垃圾回收器(GC)结合会产生outOfMemory错误。

我已经找到了解决办法是停止从第一引擎卸载所有图像时,第二,预览使用

bitmap.recyle(); 
bitmap = null; 
System.gc(); 
try { 
    synchronized (this){ 
    wait(200); 
    } 
} catch (InterruptedException e) { 

} 

你需要创建一个通知第一引擎先停止动画开始布尔首选项,以便引擎1在onSharedPreferenceChanged中检测到它并停止它的doDraw循环,然后清理它的图像。在onCreate引擎类中,您可以检测它是否为预览模式:

boolean isPreview = this.isPreview();

我不知道,如果等待(200)确实有帮助,但在理论上它应该给更多的时间来制做其GC ......反正我设法甚至索尼XPERIA摆脱的OutOfMemoryError的是真的容易出现这种类似疯狂的错误。

此外,你必须避免在你的动画循环中创建位图,那绝对不是。相反,创建引擎时创建切片位图并重用它。