1. 程式人生 > >ImageView載入圖片避免oom

ImageView載入圖片避免oom

就要用BitmapFactory.Options這個東東了,Options裡主要有兩個引數比較重要.

options.inJustDecodeBounds = false/true;
//圖片壓縮比例.
options.inSampleSize = ssize;

我們去解析一個圖片,如果太大,就會OOM,我們可以設定壓縮比例inSampleSize,但是這個壓縮比例設定多少就是個問題,所以我們解析圖片可以分為倆個步驟,
第一步就是獲取圖片的寬高

    這裡要設定Options.inJustDecodeBounds=true,這時候decode的bitmap為null,只是把圖片的寬高放在Options裡,

然後第二步就是設定合適的壓縮比例inSampleSize,這時候獲得合適的Bitmap.這裡我畫了簡單的流程圖,如下:

主要是通過BitmapFactory.Options 來實現。

Options中有個屬性inJustDecodeBounds。我們可以充分利用它,來避免大圖片的溢位問題。他是什麼原理呢?

API這樣說:如果該 值設為true那麼將不返回實際的bitmap,也不給其分配記憶體空間這樣就避免記憶體溢位了。但是允許我們查詢圖片的資訊這其中就包括圖片大小資訊(

options.outHeight (圖片原始高度)和option.outWidth(圖片原始寬度))。

Options中有個屬性inSampleSize。我們可以充分利用它,實現縮放。

如果被設定為一個值> 1,要求解碼器解碼出原始影象的一個子樣本,返回一個較小的bitmap,以節省儲存空間。

例如,inSampleSize = = 2,則取出的縮圖的寬和高都是原始圖片的1/2,圖片大小就為原始大小的1/4。

對於任何值< = 1的同樣處置為1。

那麼相應的方法也就出來了,通過設定 inJustDecodeBounds為true,獲取到outHeight(圖片原始高度)和 outWidth(圖片的原始寬度),然後計算一個inSampleSize(縮放值),

然後就可以取圖片了,這裡要注意的是,inSampleSize 可能小於0,必須做判斷。

  1. 坑一
 原來是ImageView的scaleType的問題,當設定為fitXY時,雖然ImageView顯示那麼點尺寸,但是,但是Glide載入圖片時,卻是以全解析度載入的,於是載入幾張,就OOM了。
改成fitCenter或者centerCrop(試了一下fitStart、fitEnd也行,總之看需求了),就好了,會自動快取小圖,滾動起來也非常流暢。

android:adjustViewBounds="true"圖片會根據自身寬高比縮放 不會去裁剪

相關推薦

ImageView載入圖片避免oom

就要用BitmapFactory.Options這個東東了,Options裡主要有兩個引數比較重要. options.inJustDecodeBounds = false/true; //圖片壓縮比例. options.inSampleSize = ssize;

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

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

Android避免載入圖片出現OOM

很多時候在使用BitmapFactory.decode*解碼圖片的時候會出現記憶體不足。主要有以下幾個原因導致這個問題: 移動裝置通常都限制了系統資源,一般每一個應用最小可以限制到16M。應用程式應該優化到應用能在這個最小記憶體正常執行,但是,很多裝置都配置更高的限制。Bi

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

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

cocos-Lua中Sprite與ImageView載入圖片的區別

今天 local Image =  self.gamebg:getChildByName("bet") Image:loadTexture(".../.../d.png") 指向Image:loadTexture(".../.../d.png")報錯,查了好久,才發現我在c

android載入圖片出現OOM

1.載入本地資源res/drawable出現OOM問題。 解決方法: public static Bitmap readBitMap(Context context, int resId) { BitmapFactory.Options op

關於bitmap載入圖片產生OOM的一個解決方案

  當我們使用bitmap載入一張圖片時,如果圖片比較大,而我們又不對圖片做一下處理的話,很容易出現OOM(OutOfMemory記憶體溢位) (轉載內容) 四、先來看看,Android的記憶體溢位是如何發生的? Android的虛擬機器是基於暫存器的Dalvik,它

Android開發 - ImageView載入Base64編碼的圖片

在我們開發應用的過程中,並不是所有情況下都請求圖片的URL或者載入本地圖片,有時我們需要載入Base64編碼的圖片。這種情況出現在服務端需要動態生成的圖片,比如: 二維碼 圖形驗證碼 ... 這些應用場景有個共同點就是,這些圖片都是由伺服器動態生成,並不需要生成後儲存成檔案再返回給客戶端

關於Android載入圖片時的OOM的一些解決方法和優化

1、通過強引用和弱引用以及LRU演算法。 private static final int HARD_CACHE_CAPACITY = 20;//強引用的bitmap的數量 //為了提高圖片的利用率,通過單鏈表實現先進先出,將老的圖片移到軟引用裡面儲存 private st

Glide、Picasso框架載入圖片——ImageView中、ListView中

新增許可權 <uses-permission android:name="android.permission.INTERNET"/> //引入glide compile 'com.github.bumptech.glide:glide:3.7.0' //

Listview非同步載入圖片後獲得對應位置的Imageview的方法

在Listview非同步載入網路圖片時,可在listview adapter的getview中為Imageview設定Tag(Tag為該圖片的Url,唯一),然後當載入完圖片時,可通過Listview的findViewByTag方法通過Imageview:  ImageView ima

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

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

Android利用縮放載入圖片避免記憶體溢位

因為安卓的堆記憶體有限(儘管現在隨著安卓手機螢幕解析度的提高堆記憶體沒有以前小螢幕時代那麼侷限),要是完全載入一張大圖片很容易導致OOM(out of memory)的問題。 所以為了解決這一情況,我

Glide載入圖片into(Target)導致OOM異常

轉載請註明出處:http://blog.csdn.net/forevercbb/article/details/51027727 最近在專案中遇到Drawable轉換成Bitmap的需求,Glide載

android圖片載入導致的OOM分析及有效解決辦法(BitmapUtils)

android應用尤其是涉及到很多圖片處理的經常會遇到OOM(Out Of Memory),為什麼會導致OOM,又該如何解決呢? OOM原因分析: android每一個應用都有一個獨立的程序,每個程序都是例項化了dalvik虛擬機器例項的linux程序。

Android逐幀動畫,逐幀動畫載入圖片過多時OOM異常的解決和替代方法

1.首先新增逐幀動畫 播放逐幀動畫,在工程中res目錄下建立一個anim資料夾,新增動畫anim_welcome.xml檔案如下: <?xml version="1.0" encoding="utf-8"?> <animation-li

安卓載入圖片過大而導致OOM記憶體溢位的解決方法(巨坑....)

如果圖片太大會造成OOM記憶體溢位的錯誤,需要用Bitmap的壓縮機制。 如果跳轉的頁面含有圖片可能會導致跳轉失敗。 比如說我這裡是一旦觸發了某個按鍵,就修改該xml的圖片和文字說明 則setImageResource應該改成這樣imageview.setImageBitm

根據ImageView的大小來壓縮Bitmap,避免OOM

Bitmap是引起OOM的罪魁禍首之一,當我們從網路上下載圖片的時候無法知道網路圖片的準確大小,所以為了節約記憶體,一般會在伺服器上快取一個縮圖,提升下載速度。除此之外,我們還可以在本地顯示圖片前將圖片進行壓縮,使其完全符合imageview的大小,這樣就不會浪費記憶體了。 一、思路 思路:計算出要顯示bi

ViewPager或ImgeView載入圖片出現記憶體溢位(OOM

package com.example.viewpager_demo; import java.io.InputStream; import java.util.ArrayList; import android.app.Activity; import android.graphics.Bitmap; i

Android自定義圓角矩形ImageView,支援Glide載入圖片及顏色填充

前言:  之前用到圓角的情況大都是自定義一個shape背景drawable及用到v7包下的CardView包裹View實現圓角矩形效果,還有就是在使用者圓形頭像的時候需要使用到圓角矩形(圓形可以看做是特殊的圓角矩形),諸如Button,Editext,Text