位图OutOfMemoryError

时间:2012-02-04 23:47:17

标签: android

我在大约一周前将新的动态壁纸上传到Android Market,我收到了一些关于java.lang.OutOfMemoryError的报告。

这个错误发生在没有足够内存的小手机上,可以将我的1115 x 1000图像加载为动态壁纸背景。

我已经尝试过使用inSampleSize,但是它会将背景缩小到如此之多,以至于当我尝试将其缩放回正常大小时,它们都会被缩小。

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

3 个答案:

答案 0 :(得分: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);    

答案 1 :(得分: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 ...无论如何我设法摆脱outOfmemoryError甚至索尼xPeria,这真的很容易这个疯狂的错误类型。

此外,您必须避免在动画循环中创建位图,这绝对不是不。而是在创建引擎时创建切片位图并重复使用它。

答案 2 :(得分:0)

哪些手机的显示密度为1115 x 1000像素?正确的做法是将壁纸缩小到手机显示屏的大小。任何比这更大的东西都是浪费,因为手机会浪费内存。

相关问题