第十二章 Bitmap 的載入和 Cache

2021-08-19 17:10:29 字數 2170 閱讀 5060

由於bitmap的特殊性以及android 對單個應用所施加的記憶體限制,比如16mb,這導致載入 bitmap 的時候很容易出現記憶體溢位。

載入:bitmapfactory 類提供了四類方法,decodefile、decoderesource、decodestream、decodebytearray,分別用於支援從檔案系統、資源、輸入流以及位元組陣列中載入出乙個bitmap 物件,decodefile、decoderesource間接呼叫了decodestream,這四類方法最終是在android的底層實現的,對應著bitmapfactory的幾個native方法

3. 如何高效地載入?

採用bitmapfactory.options來載入所需尺寸的,假設通過imageview來顯示,很多時候imageview並沒有的原始尺寸那麼大,整張載入進來再設定給imageview顯然沒必要,通過bitmapfactory.options就可以按一定的取樣率來載入縮小後的,將縮小後的在imageview中顯示,這樣就會降低記憶體占用從而在一定程度上避免oom,提高了bitmap載入時的效能。

通過bitmapfactory.options來縮放,主要是用到了insamplesize引數,即取樣率。當 insamplesize 為1時,取樣後的和原始大小相同;當 insamplesize 為2時,取樣後的其寬高均為原圖大小的1/2,畫素數為原圖大小的1/4。

如何獲取取樣率?

(1) 將bitmapfactory.optionsinjustdecodebounds引數設為true並載入

(2) 從bitmapfactory.options中取出原始寬高資訊,對應於outwidth、outheight

(3) 根據取樣率的規則並結合目標view的所需大小計算出取樣率insamplesize

bitmapfactory.decoderesource();

bitmapfactory.decodefile();

bitmapfactory.decodestream();

bitmapfactory.decodebytearray();

以上四個方法都是支援取樣率載入的,處理方式也是類似的。decodestream()有些特殊,需要獲取流的檔案描述符filedescriptor,通過bitmapfactory.decodefiledescriptor載入。

1. 如何避免過多的流量消耗呢?

lrucache

內部採用乙個linkedhashmap以強引用的方式儲存外界的快取物件。當快取滿的時候,lrucache 會移除較早使用的快取物件,然後再新增物件。lrucache 是執行緒安全的。

強引用:直接的物件引用

軟引用:當乙個物件只有軟引用存在時,系統記憶體不足時此物件會被 gc **

弱引用:當乙個物件只有弱引用存在時,此物件會隨時被gc**

disklrucache

磁碟快取。

壓縮:降低oom概率的有效手段

記憶體快取、磁碟快取:極大提高程式效率,有效降低使用者流量。

列表錯位:對於listview、gridview等,由於 itemview 的復用導致的列表錯位。

不要在主線程做太多的耗時操作即可提高滑動的流暢度。

1. 不要在getview中執行耗時操作。

2. 控制非同步任務的執行頻率。

如果使用者可以頻繁上下滑動,就會一瞬間產生上百個非同步任務,這些任務會造成執行緒池的擁堵並隨即帶來大量的ui更新操作,造成一定程度的卡頓?

解決:可以考慮在列表滑動的時候停止載入,開啟硬體加速。

第十二章 檔案

文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...

第十二章 dp

動態規劃策略 將原始問題拆分為多個子問題,將子問題結果記錄,方便復用子問題的解 遞迴 記憶化 遞推 是動態規劃的一體兩面,本質都是一樣的 遞推減少了呼叫次數,空間上還能優化,一般選擇遞推方式 遞迴 記憶化 int memo maxn 將o 2 n o n intfibonacci int n 遞推 ...

第十二章 異常

一 異常的概念 錯誤 編譯器 異常 執行期,程式沒有正常按照期望執行 異常產生時,在對應位置產生異常型別物件,程式 暫停 如果上下文有異常處理程式,對應處理 沒有則 異常向上傳播 報錯退出 異常向上傳播 如果異常在函式中產生,會傳播給函式的呼叫者 如果異常在模組的頂級位置,會傳播給引用該模組的模組 ...