作者chronoer (频率)
看板AndroidDev
标题Re: [问题] Bitmap OutOfMemory 永远的痛
时间Fri Jun 17 19:05:52 2011
※ 引述《lovelycateye (我还想要更多力量)》之铭言:
: 目前写了一些程式要程式好看,总是会常常碰到要处理图片。
: 而结果总是在奇怪的地方炸了。
: 问题:
: 程式内部要使用到大量图片,很多Activity都会用到。
: 而在decode bitmap一次、两次、三次...也都还没问题。
: 但是多了以後,总是会在某次就突然炸掉。
: 如果看表面会认为是decode时记忆体不足。
: 但是同时用到的图片并没有这麽多,图片会出现在不同的Activity。
: 看起来真正的问题似乎是因为一些写法造成Memory Leak之类的情况。
: 想问问看各位前辈有没有一些范例、sample code、workaround,甚至是观念讲解都好。
: 例如:
: 该用SoftReference还是WeakReference?原因?用法?
: local cache网路上的图片该怎麽做才不会有问题?
Android OOM(Out Of Memoery)问题在网路上已经有很多强者讨论过
个人一直觉得Android OOM很怪,理论上system应该要能释放出没用到的memory
(其实只是我懒得去管memory...)
解决方式大概有以下几种:
1.使用 BitmapFactory.decodeStream() 产生Bitmap
2.设定 BitmapFactory.Options inSampleSize,
(inSampleSize值越大解析度越小,占用memory也越小)
3.在 onPause/onStop/onDestory 时,将没用到的Bitmap release(用recyle())
对於将网路上的图片cache在local端的方式,
可以看foursquare for android project source code, RemoteResourceManger
google一下会有很多
我自己实作过两种方式
概念都是先开thread/asynctask去读取网路上的图片,读取到後显示在UI,
并存在local端,等下次遇到相同的url时,直接从local端读取显示出来
重点在於release没用到的图片
1.若所有图片所占memory不会大到OOM时,只有在离开Activity时,
才一次将memory中的图片清除,好处是对使用者来说显示UI会很流畅,
较不会有等待时间,坏处是release图片时机没控制好,很容易出现OOM
例子可以看foursquare的list中的图片显示
2.手动设定清除图片,例子可以看google market的list中图片显示,
当list往下卷的时候才去读取图片,当没读到或是距离太远的图片就将其
release,等user卷到该图片附近时再去读取,好处是可以控制要读取多少图片
和release多少图片,memory状态容易控制,坏处是user有时会看到空白图片,
等待时间会相对较久
粗浅观念,有错误还请版上神人不吝指正:)
--
故意和你刚好选同一节的课 故意在7-11和你偶然相遇
故意刚好一直出现在你视线内 故意在回家的路上碰巧遇到你
没什麽..因为没其他课了 没什麽..我只是买东西
没什麽..大概是刚好吧 没什麽..这是我回家的路线
其实一切都是没什麽 没什麽..只是我爱你
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.179.84
1F:推 tomap41017:感谢分享 06/17 23:12
2F:→ nvidia:赞 06/18 06:39
3F:推 chrisho:google market那个好像是因为如一次读会太久所以才故意不 06/18 11:43
4F:→ chrisho:读进来吧 06/18 11:43
5F:→ chrisho:如果真的要像QuickPIC那类一次秀很多,不如画在同一张如何 06/18 11:43
6F:推 lovelycateye:感谢提供资讯,另外我的需没办法用canvas画在一起。 06/18 23:05