大约一周前,我上传了一个新的实时墙纸到安卓市场,我收到了相当多关于java.lang.OutOfMemoryError的报告。
此错误发生在内存不足的较小手机上,无法加载我的1115x1000图像作为实时墙纸背景。
我试过使用inSampleSize,但它将背景缩小了太多,以至于当我试图将其缩小到正常大小时,它就会变得非常漂亮。
有没有人可以举例说明我如何用我的jpg图像来解决这个问题?
发布于 2012-02-05 08:32:34
我认为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); 发布于 2012-02-05 17:41:31
在过去的几周里,我也遇到了同样的难题。我可以成功地将1900x1200位图加载到我的墙纸中,但更改图像会带来outOfMemory错误。这是因为当你的墙纸运行时,它会创建一个墙纸引擎,如果你进入它的设置,那么在许多机器人上都会创建第二个预览引擎,所以你的应用程序会占用两倍的内存!
这与加载新图像时的慢速垃圾收集器(GC)结合在一起将会产生outOfMemory错误。
我找到的解决方案是,当第二个预览引擎启动时,停止并卸载第一个引擎中的所有图像
bitmap.recyle();
bitmap = null;
System.gc();
try {
synchronized (this){
wait(200);
}
} catch (InterruptedException e) {
}您需要首先通知第一个引擎停止动画,为此创建一个布尔首选项,以便引擎1在onSharedPreferenceChanged中检测到它并停止它的doDraw循环,然后清理它的图像。在onCreate的engine类中,您可以检测它是否是预览模式:
布尔isPreview = this.isPreview();
我不确定wait(200)是否真的有帮助,但从理论上讲,它应该给系统更多的时间来做GC……无论如何,我设法摆脱了outOfmemoryError,甚至在索尼xPeria上,它真的很容易出现这种类型的错误。
另外,你必须避免在你的动画循环中创建位图,这是绝对不行的。而是在创建引擎时创建切片位图并重用它。
发布于 2012-02-05 08:02:25
哪些手机的显示密度为1115x1000像素?正确的做法是将墙纸缩小到与手机显示屏完全相同的大小。任何比这更大的东西都是浪费的,因为手机会导致内存浪费。
https://stackoverflow.com/questions/9145674
复制相似问题