首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位图OutOfMemoryError

位图OutOfMemoryError
EN

Stack Overflow用户
提问于 2012-02-05 07:47:17
回答 3查看 1.3K关注 0票数 3

大约一周前,我上传了一个新的实时墙纸到安卓市场,我收到了相当多关于java.lang.OutOfMemoryError的报告。

此错误发生在内存不足的较小手机上,无法加载我的1115x1000图像作为实时墙纸背景。

我试过使用inSampleSize,但它将背景缩小了太多,以至于当我试图将其缩小到正常大小时,它就会变得非常漂亮。

有没有人可以举例说明我如何用我的jpg图像来解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-05 08:32:34

我认为slayton的回复可能是第一件要解决的事情,但你也可以使用inPreferredConfig和任何比ARGB_8888更少的东西来节省大量内存。试试RGB_565:

代码语言:javascript
复制
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);    
票数 2
EN

Stack Overflow用户

发布于 2012-02-05 17:41:31

在过去的几周里,我也遇到了同样的难题。我可以成功地将1900x1200位图加载到我的墙纸中,但更改图像会带来outOfMemory错误。这是因为当你的墙纸运行时,它会创建一个墙纸引擎,如果你进入它的设置,那么在许多机器人上都会创建第二个预览引擎,所以你的应用程序会占用两倍的内存!

这与加载新图像时的慢速垃圾收集器(GC)结合在一起将会产生outOfMemory错误。

我找到的解决方案是,当第二个预览引擎启动时,停止并卸载第一个引擎中的所有图像

代码语言:javascript
复制
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上,它真的很容易出现这种类型的错误。

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

票数 1
EN

Stack Overflow用户

发布于 2012-02-05 08:02:25

哪些手机的显示密度为1115x1000像素?正确的做法是将墙纸缩小到与手机显示屏完全相同的大小。任何比这更大的东西都是浪费的,因为手机会导致内存浪费。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9145674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档