1. 程式人生 > >Android 大批量圖片顯示時候如何避免OOM

Android 大批量圖片顯示時候如何避免OOM

     在開發Android資料恢復應用的時候,最蛋疼的莫過於圖片恢復部分,大批量的圖片載入,在瀏覽的過程很容易就出現崩潰,而這個異常就是OutOfMemory的錯誤,簡稱為OOM。(煩)的虛擬機器是基於暫存器的Dalvik,它的最大堆大小一般是16M,有的機器為24M。我們平常看到的OutOfMemory的錯誤,通常 是堆記憶體溢位。移動開發和web開發的最大的區別是裝置資源受限,對一般手機應用,這個資源是相當有限的,堆記憶體的上限值只有16M。Android的缺 省值是16M(某些機型是24M),而對於普通應用這是不能改的,當應用程式處理大資源的資源,如圖片或視訊等媒體資源時 ,數量一多,時間一長,這個16M是很容易耗盡的,OOM是很容易出現的。

      雖然JAVA有垃圾回收機制,但也存在記憶體洩露。如果我們一個程式中,已經不再使用某個物件,但是因為仍然有引用指向它,垃圾回收器就無法回收它,當然 該物件佔用的記憶體就無法被使用,這就造成了記憶體洩露。如果我們的java執行很久,而這種記憶體洩露不斷的發生,最後就沒記憶體可用了。當然java的,記憶體 洩漏和C/C++是不一樣的。如果java程式完全結束後,它所有的物件就都不可達了,系統就可以對他們進行垃圾回收,它的記憶體洩露僅僅限於它本身,而不 會影響整個系統的。C/C++的記憶體洩露就比較糟糕了,它的記憶體洩露是系統級,即使該C/C++程式退出,它的洩露的記憶體也無法被系統回收,永遠不可用 了,除非重啟機器。

    幸好的是在網上找不到不少針對大批量圖片載入的優化方案,完美解決的主要方案還是LruCache和DiskLruCache完美結合到一起其實這個方案主要就是通過硬碟快取和記憶體快取的合作來完成,因為單靠記憶體來快取這麼多的圖片顯然是不顯示的,但是單靠硬碟快取,在讀取方面又不如記憶體快取獲取的速度快。因為兩者結合就可以很好解決

int maxMemory = (int) Runtime.getRuntime().maxMemory();  
  int cacheSize = maxMemory / 8;  
  mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {  
@Override  
  protected int sizeOf(String key, Bitmap bitmap) {  
     return bitmap.getByteCount();  
  };  
try {  
    File cacheDir = getDiskCacheDir(context, "thumb");  
    if (!cacheDir.exists()) {  
        cacheDir.mkdirs();  
    }  
    // 建立DiskLruCache例項,初始化快取資料  
    mDiskLruCache = DiskLruCache  
            .open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);  
} catch (IOException e) {  
    e.printStackTrace();  
}

這部分程式碼就是完成把LruCache和DiskLruCache的初始化工作完成了。
主要實現獲取圖片的流程就是當需要獲取圖片時候,首先來從記憶體中獲取快取,如果獲取到了就將圖片顯示到介面上。如果記憶體中沒有獲取到,則開啟一個BitmapWorkerTask任務來去非同步載入圖片。

那麼在BitmapWorkerTask的doInBackground()方法中,主要用使用DiskLruCache技術。首先根據圖片的URL生成對應的MD5 key,然後呼叫DiskLruCache的get()方法來獲取硬碟快取,如果沒有獲取到的話則從網路上請求圖片並寫入硬碟快取,接著將Bitmap物件解析出來並新增到記憶體快取當中,最後將這個Bitmap物件顯示到介面上,這樣一個完整的流程就執行完了。

DiskLruCache會根據我們在呼叫open()方法時設定的快取最大值來自動刪除多餘的快取。只有你確定某個key對應的快取內容已經過期,需要從網路獲取最新資料的時候才應該呼叫remove()方法來移除快取。

相關推薦

Android 批量圖片顯示時候如何避免OOM

     在開發Android資料恢復應用的時候,最蛋疼的莫過於圖片恢復部分,大批量的圖片載入,在瀏覽的過程很容易就出現崩潰,而這個異常就是OutOfMemory的錯誤,簡稱為OOM。(煩)的虛擬機器是基於暫存器的Dalvik,它的最大堆大小一般是16M,有的機器為24M。

Android瀑布流優化,解決Recyclerview展示批量圖片時Item自動切換、閃爍、空白等問題

本文涉及的程式碼案例可以在下方的連結中找到,如果對你有幫助,請給個Star(#^.^#)問題分析        這段時間業務需求用到RecyclerView瀑布流載入並展示大批量圖片,但一開始單純使用RecyclerView直接載入圖片,使得顯示上出現了滑動到頂端時閃爍,It

Android瀑布流優化,解決Recyclerview展示批量圖片時Item自動切換、閃爍、空白等問題...

code小生,一個專注於 Android 領域的技術分享平臺作者:請抱抱陳先生地址:https:

Android WebView載入圖片顯示的處理

Webview載入圖片時,經常會遇到圖片顯示不符合預期的問題。下面給出解決辦法:利用Jsoup解析html指定img標籤的寬高屬性來解決。小提示:("width", "100%")——>解決了圖片過大,超出螢幕顯示的問題,但是此時會帶來一個新的bug,就是當圖片小於螢幕

ubuntu下對批量圖片檔名的匯出

       最近在做實驗需要用到大量圖片,但是在製作資料集的過程中遇到需要將所有的檔名匯出製成一個.txt檔案,用於程式對圖片的讀取操作。一開時在win10上面使用.bat檔案的方式讀取圖片檔名(關於.bat讀取檔名的方式,百度一下就會有很多,但是讀取的結果

java 導出 excel 最佳實踐,java 文件 excel 避免OOM(內存溢出) exce

體驗 實現類 體會 當前 解決 get 類型 model 所有 產品需求 產品經理需要導出一個頁面的所有的信息到 EXCEL 文件。 需求分析 對於 excel 導出,是一個很常見的需求。 最常見的解決方案就是使用 poi 直接同步導出一個 excel 文件。 客戶體驗 &

Android Webview 部分圖片顯示不出來問題

最近發現在華為Mate 10 上面我們app的內建webview會有部分圖片不展示,直接就圖裂了。 經過繞了一大圈後才解決了問題,其實問題原因很簡單,但是分析過程不順利。拿出來分享下,希望可以幫助大家少走彎路。 簡單說下這個問題的背景 1.我們的新聞圖片在除了華為Mat

android開發base64圖片顯示

Log.d("pmftest", "onResponse: 圖片"+photoback); Bitmap bitmap=null; byte[]bitmapArray; bitmapArray=Base64.decode(photoback, Base64.DEFAU

android:scaleType 設定圖片顯示

ImageView的Scaletype決定了圖片在View上顯示時的樣子,如進行何種比例的縮放,及顯示圖片的整體還是部分,等等。 設定的方式包括: 1. 在layout xml中定義android:scaleType="CENTER" 2. 或在程式碼中呼叫i

使用 WebView 顯示圖片 避免oom錯誤

一同學(@zhangqi6627)的思路 不失為一個解決顯示大圖片避免oom錯誤的方案 今天測試了一下效能 發現webview 初始化的時候佔用的記憶體是 imageview初始化佔用記憶體的5倍 webview loadurl load圖片的時候基本不佔記憶體  ima

Android BitmapFactory.Options 解決圖片加載OOM問題

evel 寬高 lock github 取圖 math 使用 最終 過程 當我們在Android使用bitmap加載圖片過程中,它會將整張圖片所有像素都存在內存中,由於Android對圖片內存使用的限制,很容易出現OOM(Out of Memory)問題。 為了避免此類問題

Android在開啟一個新的Activity瀏覽圖時使用ImageView/PhotoView的時候圖片顯示在螢幕上部的問題

如題:昨天再做這個需求時,先在xml裡面放入的是一個ImageView來載入圖片,在載入完圖片時使用 PhotoViewAttacher attacher = new PhotoViewAttacher(ivBigImageView); 達到的效果是當點開瀏覽大圖的Activity頁面時圖片

Android之解決太太多圖片造成的oom

在最近做的工程中發現載入的圖片太多或圖片過大時經常出現OOM問題,找網上資料也提供了很多方法,但自己感覺有點亂,特此,今天在不同型號的三款安卓手機上做了測試,因為有效果也有結果,今天小馬就做個詳細的總結,以供朋友們共同交流學習,也供自己以後在解決OOM問題上有所提高,提前講下,片幅有點長,涉及的東西太多,大家

Android 高清載入巨圖方案 拒絕壓縮圖片 避免oom

一、概述 距離上一篇部落格有段時間沒更新了,主要是最近有些私事導致的,那麼就先來一篇簡單一點的部落格脈動回來。 對於載入圖片,大家都不陌生,一般為了儘可能避免OOM都會按照如下做法: 對於圖片顯示:根據需要顯示圖片控制元件的大小對圖片進行壓縮顯示。如果圖片數量非常多:則會使

Android讀取本地圖片圖片導致OOM問題。

這是畢設中,我要讀取本地相機拍攝到的相片時,遇到的問題,提示OOM,然後強制關閉,這篇部落格點選開啟連結裡提到了一種方法能解決這個問題。我把主要內容寫下: public final class BitMapUtil { private static final

Android開發之listview優化+圖片非同步載入+避免圖片顯示閃爍(修改版)

小鹿路過此地。。心熱之下寫寫Android開發中的listview運用(閒的沒事幹,改動了一點程式碼,但實現功能不變) 小鹿學Android開發已有兩年多了,總算有一點點小收穫,雖算不上大牛大神級人物,但有些東西可以和一家一起分享一起交流一起學習一起進步...。還有,望檢視

[轉]ionic或者angularjs中圖片顯示壓縮問題解決 or 顯示圖片的某一塊區域、裁剪顯示

嚴重 cover width 調整 解決 csdn target lan 壓縮 我們知道在html中顯示圖片一般都是用img控件標簽,當然調整大小的也很容易。 但是會出現,特定的img大小,顯示一張比較大尺寸的且長寬比例與特定img大小不相符的圖片。而導致壓縮問題,圖片擠壓

Android中內存泄露與如何有效避免OOM總結

ignore create ui線程 nbsp weak solver 部分 ont 占用 一、關於OOM與內存泄露的概念 我們在Android開發過程中經常會遇到OOM的錯誤,這是因為我們在APP中沒有考慮dalvik虛擬機內存消耗的問題。 1

Android ImageView setImageBitmap 不顯示圖片

true byte onf fig .config 顯示圖片 pri factory deb 從sd卡裏讀出圖片後有時調用setImageBitmap(bitmap)方法會顯示不出圖片,仔細考慮過後原來是加載的圖片過大導致的,解決辦法為: BitmapFactory.

Android】使用IconFont顯示圖片,從而縮小體積

center png 分享 壓縮 you 通過 顯示 white 下載 1、從http://www.iconfont.cn/選取需要添加的圖標,添加到購物車。2、在購物車中選擇下載代碼。 3、打開壓縮包,將壓縮包中的四個文件放入工程中的asstes文件夾下。 4、在代碼中通