Bitmap recycle()

Bitmap調用recycle? When?

?

?

Bitmap有一個recycle方法。含義很easy,恢復Bitmap空間。

?

Q 1: Bitmap有調用recycle方法的必要性?

A: 嵌入式系統總是格外注重空間的問題,不小心的話就會有OOM。

可是應用層使用java的android平臺有其天然的優勢【java語言有自己的垃圾回收,android平臺上各個application有自己的process自己的空間】。

??? 無需調用bitmap的理由有:

??? a. 垃圾回收會處理的。

??? b. 當application關閉,process被殺掉。全部這個process占用的空間自然回歸系統;

?

??? 可是。假設你有點潔癖。或者有點理想主義。或者非常有控制欲,或者非常閑。。。

bitmap的recycle函數的調用還是能夠是有必要的,理由有:

??? a. 垃圾回收盡管好使,可是有可能的話,我們還是讓它少干點活吧。

垃圾回收有非常大的未來不確定性,會加重未來未知時間點的loading,若有大量bitmap須要垃圾回收處理,那必定垃圾回收須要做的次數就很多其它也發生地更頻繁,小心會造成ANR。

可是,若是自己recycle。就能夠可控制地分散處理了這些回收任務了。

??? b. 若是launcher那樣一直執行的application,它的process一直存在,memory問題還是多多注意下比較好。

?

Q2: When?

A: Timing的問題在這里非常重要。

早了就大事不好了,會有這種Exception:

??? java.lang.RuntimeException,Canvas: trying to use a recycled bitmap

android.graphics.Bitmap@44ebeee0,Canvas.java,955

??? So, 如何才干夠保證不會早了呢?

??? 關于圖片顯示。重要的時間點:

??? step1: 設置進去的時間點。

??? Step2: 畫面畫出來的時間點;

??? 最保險最笨的做法,在新的圖片設置進去以后再recycle掉老的圖片,這樣做的壞處在于,在某個時間段,你須要的空間是double的【新舊兩套都在】。

??? 假設你不偏向于那么做,又有時間,能夠考慮后面一個時間點,除了setImage以及其他代碼中顯示調用那個bitmap的時候我們會檢查bitmap,在acticvity變為visible的時候系統還是會去找之前設置進去的bitmap【即使你的onResume方法里面并沒有提到去refresh UI。這件事情它也是會去做的,大概不然它就不知道這次該顯示些什么了】。

所以,在UI線程里面,在一個不可能被打斷的方法里面。是先設置新的bitmap還是先recycle舊的圖片是沒有影響的。

??? 譬如說???? mBitmap.recycle();

????????????????? mBitmap = .....?? //設置

????????????????? mImageView.setImage(mBitmap);

??? 這種代碼是全然能夠的。

?

??? 后面這種做法,最重要的就是確保:在UI線程【由于設置UI顯示僅僅能在UI主線程里】里面一個不可能被打斷的方法里面。

這個是為了確保在兩者之間UI主線程不可能被打斷。不可能剛好從invisible變成visible。

??? 所以,特別小心兩種東西:

??? 1. 多線程【個人認為最好不要在其它線程里面調用UI用過的bitmap的recycle方法,多線程之間是非常難保證時間順序的。臨時沒有想出一種在background thread里面recycle的合理的方式】。

??? 2. 非及時發生的方法:譬如。發intent啊。發notify啊去通知UI主線程去做UI又一次刷新并不能替代mImageView.setImage(mBitmap);這種句子。全然有可能,你確實發了intent出去了。可是目標activity之中的一個還沒有做UI又一次設置【Q: maybe沒收到 or 收到但還是等待處理。不確定這兩種可能是不是都有可能】,這個時候這個acitivity變成visible了,系統仍然試圖找舊的圖片。找不到了就會報exception了。

?

PS: java.lang.RuntimeException,Canvas: trying to use a recycled bitmap android.graphics.Bitmap@44ebeee0,Canvas.java,955 這種exception也許你可能無法看到,默認log這似乎僅能夠看到uncaught exception,我第一次看到monkey的events.log里面,如果你知道如何在這方面打開相應的電話log trace你也應該能看到。

?

轉載于:https://www.cnblogs.com/hrhguanli/p/4576822.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258741.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258741.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

擴展歐幾里得算法求逆元_從輾轉相除法到求逆元,數論算法初體驗

今天是算法和數據結構專題的第22篇文章,我們一起來聊聊輾轉相除法。輾轉相除法又名歐幾里得算法,是求最大公約數的一種算法,英文縮寫是gcd。所以如果你在大牛的代碼或者是書上看到gcd,要注意,這不是某某黨,…

[翻譯] Fast Image Cache

https://github.com/path/FastImageCache Fast Image Cache is an efficient, persistent, and—above all—fast way to store and retrieve images in your iOS application. Part of any good iOS applications user experience is fast, smooth scrolling, and Fast Image …

centos 安裝 MatConvNet (gpu)

1. 安裝準備 matlab2017a ,參考:《centos 安裝matlab2017a(無root權限)》 GCC 4.8(支持c11) 鍵入:sudo yum install gcc gcc-c (建議sudo裝) 至少CUDA 7.5,(本人選擇cuda8.0&#xff…

php練習 租房子

題目要求 1.封裝類 <?php class DBDA {public $fuwuqi"localhost"; //服務器地址public $yonghuming"root";//用戶名public $mima"";//密碼 public $dbconnect;//連接對象//操作數據庫的方法//$sql代表需要執行的SQL語句//$type代表SQL語…

【SHARE】WEB前端學習資料

參考資料&#xff1a;https://github.com/karlhorky/learn-to-program學習網站&#xff1a;http://www.codecademy.com/learn https://www.codeschool.com/ 制作網站&#xff1a;https://webmaker.org/zh-CN/explore JavaScript2015&#xff1a;https://esdiscuss.org/topic/ja…

python軟件安裝和使用方法_aws cli的安裝及使用(內含python的安裝方法)

liunx環境(使用bundled installer)&#xff1a;1.wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip //下載bundled installer2.unzip awscli-bundle.zip3.sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws如果你沒有sudo權限或者是你想在當…

centos 安裝boost(caffe需要)

安裝 由于安裝caffe&#xff0c;要求boost的版本在1.55以上&#xff0c;而服務器上的剛好是1.54,所以進行了重裝。 參考&#xff1a;《CentOS 7下編譯安裝Boost_1_57_0 》 不過由于pycaffe需要boost.python,因此需要在./b2時修改為./b2 –stage debug 才可以。而不能去掉py…

JAVA正則表達式介紹和使用

本文引用自 http://www.cnblogs.com/android-html5/archive/2012/06/02/2533924.html 技術博客 1.Java中在某個字符串中查詢某個字符或者某個子字串 Java代碼 String s "Shang Hai Hong Qiao Fei Ji Chang";    String regEx "a|F"; //表示a或F Pat…

集合框架中的接口及其實現類

Collection&#xff1a;集合層次中的根接口&#xff0c;JDK沒有提供這個接口直接地實現類。Set&#xff1a;不能包含重復的元素。SortedSet是一個按照升序排列元素的Set。List&#xff1a;是一個有序的集合&#xff0c;可以包含重復的元素。提供了按索引訪問的方式。Map&#x…

C# 多線程 Parallel.For 和 For 誰的效率高?那么 Parallel.ForEach 和 ForEach 呢?

還是那句話&#xff1a;十年河東&#xff0c;十年河西&#xff0c;莫欺少年窮。 今天和大家探討一個問題&#xff1a;Parallel.For 和 For 誰的效率高呢&#xff1f; 從CPU使用方面而言&#xff0c;Parallel.For 屬于多線程范疇&#xff0c;可以開辟多個線程使用CPU內核&#x…

cuda、cudnn相關問題鏈接

1. cuda&#xff0c;cudnn安裝 <caffe安裝系列——安裝cuda和cudnn> 2. 查看已有的cuda等版本 cuda 版本 cat /usr/local/cuda/version.txtcudnn 版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 23. cudnn的安裝&#xff0c;路徑和版本問題 http://…

bigdecimal 小于等于0_圖解小于 K 的兩數之和

點擊藍色“五分鐘學算法”關注我喲加個“星標”&#xff0c;天天中午 12:15&#xff0c;一起學算法作者 | P.yh來源 | 五分鐘學算法題目描述 題目來源于 LeetCode 上第 1099 號問題&#xff1a;小于 K 的兩數之和。給你一個整數數組 A 和一個整數 K&#xff0c;請在該數組中找出…

用STS創建Maven的Web項目轉

右鍵New——>other——》Maven——》Maven Project 彈出框中點擊Next&#xff0c;在Filter中寫上&#xff1a;webapp. 然后在下面的框中選擇org.apache.maven.archetypes&#xff0c;點擊Next 在新彈出的窗口中寫上Group Id和Artifact Id&#xff0c;Finish即可成功。 創建完…

img超出div width時, jQuery動態改變圖片顯示大小

參考&#xff1a; 1. http://blog.csdn.net/roman_yu/article/details/6641911 2. http://www.cnblogs.com/zyzlywq/archive/2012/02/23/2364292.html轉載于:https://www.cnblogs.com/carlo/p/4584008.html

《TOGAF 9.1IT企業架構》什么是企業IT架構

2. 什么是企業IT架構 現在有越來越多的企業IT架構定義。在這一章&#xff0c;你會學習到一些企業IT架構的方法&#xff0c;我們會給你深入解釋一種實用的方法&#xff0c;這種方法視企業架構師為CIO(譯注&#xff1a;CIO首席信息官&#xff0c;是負責一個公司信息技術和系統所有…

pdf 深入理解kotlin協程_Kotlin協程實現原理:掛起與恢復

今天我們來聊聊Kotlin的協程Coroutine。如果你還沒有接觸過協程&#xff0c;推薦你先閱讀這篇入門級文章What? 你還不知道Kotlin Coroutine?如果你已經接觸過協程&#xff0c;但對協程的原理存在疑惑&#xff0c;那么在閱讀本篇文章之前推薦你先閱讀下面的文章&#xff0c;這…

編譯py-faster-rcnn的問題匯總及解決方法

按照官網 的提示&#xff0c;我開始安裝faster rcnn&#xff0c;但是出現了很多問題&#xff0c;我將其匯總了起來&#xff0c;并提出了解決辦法。 先說明一下我的配置&#xff1a; python : anaconda2linux: centos 6.9 安裝faster rcnn請先參考&#xff1a;《cuda8cudnn4 F…

openWRT自學---針對backfire版本的主要目錄和文件的作用的分析整理

特別說明&#xff1a;要編譯backfire版本&#xff0c;一定要通過svn下載:svn co svn://svn.openwrt.org/openwrt/branches/backfire&#xff0c;而不能使用http://downloads.openwrt.org/backfire/10.03/中的源碼包&#xff1a;backfire_10.03_source.tar.bz2 結合文檔《OpenWr…

自然語言交流系統 phxnet團隊 創新實訓 項目博客 (五)

3DMax方面所涉及的專業知識&#xff1a; &#xff08;1&#xff09;一下的關于3DMax中對于人物的設計和操作均需要在對3DMax基礎知識熟練掌握的情況下進行的。 &#xff08;2&#xff09;骨骼架設&#xff1a;首先對導入到3DMax中的人物模型進行架設骨骼…

linux 安裝python-opencv

三種方法&#xff1a; 1. pip 安裝 &#xff1a; pip install opencv-python &#xff0c;最新版為opencv3安裝后>>> import cv2 >>> print cv2.__version__參考&#xff1a;http://www.cnblogs.com/lclblack/p/6377710.html 2. anaconda的conda安裝 ,可以指…