Bitmap recycle()
Bitmap調(diào)用recycle? When?
?
?
Bitmap有一個(gè)recycle方法。含義很easy,恢復(fù)Bitmap空間。
?
Q 1: Bitmap有調(diào)用recycle方法的必要性?
A: 嵌入式系統(tǒng)總是格外注重空間的問題,不小心的話就會(huì)有OOM。
可是應(yīng)用層使用java的android平臺(tái)有其天然的優(yōu)勢(shì)【java語言有自己的垃圾回收,android平臺(tái)上各個(gè)application有自己的process自己的空間】。
??? 無需調(diào)用bitmap的理由有:
??? a. 垃圾回收會(huì)處理的。
??? b. 當(dāng)application關(guān)閉,process被殺掉。全部這個(gè)process占用的空間自然回歸系統(tǒng);
?
??? 可是。假設(shè)你有點(diǎn)潔癖?;蛘哂悬c(diǎn)理想主義?;蛘叻浅S锌刂朴?#xff0c;或者非常閑。。。
bitmap的recycle函數(shù)的調(diào)用還是能夠是有必要的,理由有:
??? a. 垃圾回收盡管好使,可是有可能的話,我們還是讓它少干點(diǎn)活吧。
垃圾回收有非常大的未來不確定性,會(huì)加重未來未知時(shí)間點(diǎn)的loading,若有大量bitmap須要垃圾回收處理,那必定垃圾回收須要做的次數(shù)就很多其它也發(fā)生地更頻繁,小心會(huì)造成ANR。
可是,若是自己recycle。就能夠可控制地分散處理了這些回收任務(wù)了。
??? b. 若是launcher那樣一直執(zhí)行的application,它的process一直存在,memory問題還是多多注意下比較好。
?
Q2: When?
A: Timing的問題在這里非常重要。
早了就大事不好了,會(huì)有這種Exception:
??? java.lang.RuntimeException,Canvas: trying to use a recycled bitmap
android.graphics.Bitmap@44ebeee0,Canvas.java,955
??? So, 如何才干夠保證不會(huì)早了呢?
??? 關(guān)于圖片顯示。重要的時(shí)間點(diǎn):
??? step1: 設(shè)置進(jìn)去的時(shí)間點(diǎn)。
??? Step2: 畫面畫出來的時(shí)間點(diǎn);
??? 最保險(xiǎn)最笨的做法,在新的圖片設(shè)置進(jìn)去以后再recycle掉老的圖片,這樣做的壞處在于,在某個(gè)時(shí)間段,你須要的空間是double的【新舊兩套都在】。
??? 假設(shè)你不偏向于那么做,又有時(shí)間,能夠考慮后面一個(gè)時(shí)間點(diǎn),除了setImage以及其他代碼中顯示調(diào)用那個(gè)bitmap的時(shí)候我們會(huì)檢查bitmap,在acticvity變?yōu)関isible的時(shí)候系統(tǒng)還是會(huì)去找之前設(shè)置進(jìn)去的bitmap【即使你的onResume方法里面并沒有提到去refresh UI。這件事情它也是會(huì)去做的,大概不然它就不知道這次該顯示些什么了】。
所以,在UI線程里面,在一個(gè)不可能被打斷的方法里面。是先設(shè)置新的bitmap還是先recycle舊的圖片是沒有影響的。
??? 譬如說???? mBitmap.recycle();
????????????????? mBitmap = .....?? //設(shè)置
????????????????? mImageView.setImage(mBitmap);
??? 這種代碼是全然能夠的。
?
??? 后面這種做法,最重要的就是確保:在UI線程【由于設(shè)置UI顯示僅僅能在UI主線程里】里面一個(gè)不可能被打斷的方法里面。
這個(gè)是為了確保在兩者之間UI主線程不可能被打斷。不可能剛好從invisible變成visible。
??? 所以,特別小心兩種東西:
??? 1. 多線程【個(gè)人認(rèn)為最好不要在其它線程里面調(diào)用UI用過的bitmap的recycle方法,多線程之間是非常難保證時(shí)間順序的。臨時(shí)沒有想出一種在background thread里面recycle的合理的方式】。
??? 2. 非及時(shí)發(fā)生的方法:譬如。發(fā)intent啊。發(fā)notify啊去通知UI主線程去做UI又一次刷新并不能替代mImageView.setImage(mBitmap);這種句子。全然有可能,你確實(shí)發(fā)了intent出去了??墒悄繕?biāo)activity之中的一個(gè)還沒有做UI又一次設(shè)置【Q: maybe沒收到 or 收到但還是等待處理。不確定這兩種可能是不是都有可能】,這個(gè)時(shí)候這個(gè)acitivity變成visible了,系統(tǒng)仍然試圖找舊的圖片。找不到了就會(huì)報(bào)exception了。
?
PS: java.lang.RuntimeException,Canvas: trying to use a recycled bitmap android.graphics.Bitmap@44ebeee0,Canvas.java,955 這種exception也許你可能無法看到,默認(rèn)log這似乎僅能夠看到uncaught exception,我第一次看到monkey的events.log里面,如果你知道如何在這方面打開相應(yīng)的電話log trace你也應(yīng)該能看到。
?
轉(zhuǎn)載于:https://www.cnblogs.com/hrhguanli/p/4576822.html
總結(jié)
以上是生活随笔為你收集整理的Bitmap recycle()的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交行全币种国际信用卡有多少额度?如何快速
- 下一篇: 集合框架中的接口及其实现类