**:
高效使用bitmaps有什麼好處?
我 們常常提到的「android程式優化」,通常指的是效能和記憶體的優化,即:更快的響應速度,更低的記憶體占用。android程式的效能和記憶體問題,大部 分都和緊密相關,而的載入在很多情況下很用到bitmap(位圖)這個類。而由於bitmap自身的特性(將每個畫素的屬性全部儲存在記憶體中), 導致稍有不慎就會建立出乙個占用記憶體非常大的bitmap物件,從而導致載入過慢,還會有記憶體溢位的風險。所以,android程式要做優 化,bitmap的優化是必不可少的一步。
需要對bitmap進行優化
的情形
首先請看一行**:
1
mimageview.setimageresource(r.drawable.my_image);
這是一行從資源檔案中載入到imageview的**。通常這段**沒什麼問 題,但有些情況下,你需要對這段**進行優化。例如當的尺寸遠遠大於imageview的尺寸時,或者當你要在乙個listview或 gridview中批量載入一些大小未知的時。實際上,以上這行**會在執行時使用bitmapfactory.decodestream()方法將 資源生成乙個bitmap,然後由這個bitmap生成乙個drawable,最後再將這個drawable設定到imageview。由於在過程中 生成了bitmap,因此如果你使用的過大,就會導致效能和記憶體占用的問題。另外,需要優化的情形不止這一種,這裡就不再列舉。
下面分步說明使用**來減小bitmap的尺寸從而達到減小記憶體占用的方法:
1. 獲取原尺寸
通常,我們使用bitmapfactory.decoderesource()方法來從資源檔案中讀取一
張 並生成乙個bitmap。但如果使用乙個bitmapfactory.options物件,並把該物件的injustdecodebounds屬性設 置為true,decoderesource()方法就不會生成bitmap物件,而僅僅是讀取該的尺寸和型別資訊:
1
bitmapfactory.options options =
new
bitmapfactory.options();
2
options.injustdecodebounds =
true
;
3
bitmapfactory.decoderesource(getresources(), r.id.myimage, options);
4
int
imageheight = options.outheight;
5
int
imagewidth = options.outwidth;
6
string imagetype = options.outmimetype;
2. 根據原圖尺寸和目標區域的尺寸計算出合適的bitmap尺寸
bitmapfactory.options類有乙個引數 insamplesize,該引數為int型,他的值指示了在解析為bitmap時在長寬兩個方向上畫素縮小的倍數。insamplesize的預設 值和最小值為1(當小於1時,解碼器將該值當做1來處理),且在大於1時,該值只能為2的冪(當不為2的冪時,解碼器會取與該值最接近的2的冪)。例如, 當insamplesize為2時,乙個2000*1000的,將被縮小為1000*500,相應地,它的畫素數和記憶體占用都被縮小為了原來的 1/4:
01
public
static
int
calculateinsamplesize(
02
bitmapfactory.options options,
int
reqwidth,
int
reqheight)
18
}
19
20
return
insamplesize;
21
}
3. 根據計算出的insamplesize生成bitmap
01
public
static
bitmap decodesampledbitmapfromresource(resources res,
int
resid,
02
int
reqwidth,
int
reqheight)
這裡有一點要注意,就是要在第二遍decode之前把injustdecodebounds設定回false。
4. 呼叫以上的
decodesampledbitmapfromresource方法,使用自定尺寸的bitmap。
如果你要將一張大圖設定為乙個100*100的縮圖,執行以下**:
1
mimageview.setimagebitmap(decodesampledbitmapfromresource(getresources(), r.id.myimage,
100
,
100
));
到此,使用decoderesource()方法將乙個大**析為小尺寸bitmap的應用就完成了。同理,還可以使用decodestream(),decodefile()等方法做相同的事,原理是一樣的。
延伸:乙個bitmap到底占用多大記憶體?系統給每個應用程式分配多大記憶體?
· bitmap占用的記憶體為:畫素總數 * 每個畫素占用的記憶體。在android中,bitmap有四種畫素型別:argb_8888、argb_4444、argb_565、alpha_8,他 們每個畫素占用的位元組數分別為4、2、2、1。因此,乙個2000*1000的argb_8888型別的bitmap占用的記憶體為 2000*1000*4=8000000b=8mb。
· android根據裝置螢幕尺寸和dpi的不同,給系統分配的單應用程式記憶體大小也不同,具體如下表(**取自android 4.4 compatibility definition document (cdd)):
螢幕尺寸
dpi應用記憶體
small / normal / large
ldpi / mdpi
16mb
small / normal / large
tvdpi / hdpi
32mb
small / normal / large
xhdpi
64mb
small / normal / large
400dpi
96mb
small / normal / large
xxhdpi
128mb
xlarge
mdpi
32mb
xlarge
tvdpi / hdpi
64mb
xlarge
xhdpi
128mb
xlarge
400dpi
192mb
xlarge
xxhdpi
256mb
高效使用Bitmaps(一) 大Bitmap的載入
文章出處 摘要 我們常常提到的 android程式優化 通常指的是效能和記憶體的優化,即 更快的響應速度,更低的記憶體占用。android程式的效能和記憶體問題,大部分都和緊密相關,而的載入在很多情況下很用到bitmap 位圖 這個類。而由於bitmap自身的特性 將每個畫素的屬性全部儲存在記憶體中...
一 大資料概述
1.列舉hadoop生態的各個元件及其功能 以及各個元件之間的相互關係,以圖呈現並加以文字描述。答 主要的核心元件有hdfs和mapreduce,其他還包括zookeeper hbase hive pig mahout sqoop flume ambari等功能元件 hdfs hdfs具有很好的容錯...
一 大資料概述
1.列舉hadoop生態的各個元件及其功能 以及各個元件之間的相互關係,以圖呈現並加以文字描述。hdfs 分布式儲存系統。yarn 資源排程。mapreduce 任務計算。hive 讓hadoop集群擁有關係型資料庫的sql體驗,本質是hadoop的乙個外掛程式,如果有統計,加減乘除等計算任務就會將...