日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Bitmap recycle()

發(fā)布時(shí)間:2023/12/13 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bitmap recycle() 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。