大家好我是Android的新手,我在一周前在这个链接中发布了一个问题,基本上说当我使用很多不同的背景进行我的活动时,我得到了一个java.lang.outofmemory错误。 why am I getting errors when I use different backgrounds in xml
因此,作为一名新开发人员,我搜索并搜索了一个解决方案,以便在我从活动开始时清除内存,但没有一个是清晰或精确的。然后我偶然发现了这个网站http://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/
它描述了我正在经历的事情,除了他们使用10个活动而我只使用4个。但是当我实现他的代码时,我的项目我最终得到了空指针异常,并且在摆弄他的代码之后我最终回来了我开始时出现相同的内存不足错误。 所以任何人都可以指引我找一个可以告诉我如何拥有尽可能多的背景而不会耗尽内存的人。或者Android这么棒,不会让你只是使用超过一定数量的背景?帮助
答案 0 :(得分:1)
并不是说背景数量有限制,但是你加载的每个背景图像都是作为位图加载到内存中并保存在那里直到活动被破坏。如果您要一个接一个地打开多个活动,则每个背景图像都需要保存在内存中,因此最终会出现内存不足异常。
如果设置大背景图像,则在ui线程上也会遇到一些阻塞,同时图像会加载到内存中。
对我有用的一种方法是使用图像加载器。这会将图像解码为ui线程,将其缓存在磁盘上,将其加载到内存中,如果内存不足,则会从内存中清除映像并回退到磁盘缓存。加载图像时可能会有轻微的延迟/淡入,但视觉上并没有那么糟糕,加载一次后,如果你回到那个活动,它会立即加载。
查看Picaso Picasso,它非常容易实现,并且是一个很棒的api或Universal Image Loader。
我的布局都是RelativeLayouts,第一个子窗口(将在所有其他视图后面)是一个带有scaleType centercrop且宽度和高度设置为match_parent的ImageView。加载每个活动时(onCreate),只需获取布局中imageview的引用,并使用您选择的ImageLoader设置所需的背景图像。
另一种选择是在您的资源中拥有背景图像的多个副本,每个副本都会调整大小以完全适合您选择的分辨率(drawable-mdpi / -hdpi / -xhdpi等)。这样,您可以确保永远不会加载比您需要显示的图像更大的图像,并且您的应用程序在内存消耗方面将更加宽容。