關(guān)鍵字:圖片緩存
LruCache
ImageCache
NetworkImageView
ImageRequest
ImageLoader
前言:上篇筆記 記錄了Volley
的簡單用法撞蚕,進(jìn)行簡單的GET非区、POST請求告喊。這篇文章將記錄Volley
加載、緩存圖片的用法星著。
Volley
還可以進(jìn)行圖片的加載和緩存,可以利用ImageRequest
對象簡單粗悯、方便地進(jìn)行網(wǎng)絡(luò)圖片的獲取虚循。ImageLoader
用于獲取或緩存圖片。NetworkImageView
是Volley提供的一個自定義View样傍,可直接設(shè)置網(wǎng)絡(luò)圖片横缔。
1. 使用ImageRequest
簡單地進(jìn)行網(wǎng)絡(luò)圖片的獲取
String url = "https://images.unsplash.com/photo-1445251836269-d158eaa028a6?fit=crop&fm=jpg&h=625&ixlib=rb-0.3.5&q=80&w=1375";
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
//構(gòu)建ImageRequest 實(shí)例
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
//給imageView設(shè)置圖片
myImageView.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//設(shè)置一張錯誤的圖片,臨時用ic_launcher代替
myImageView.setImageResource(R.drawable.ic_launcher);
}
});
requestQueue.add(request);
注意:在構(gòu)建ImageRequest
實(shí)例時衫哥,需要傳遞七個參數(shù)(六個參數(shù)的重載方法已過時茎刚,少一個ScaleType
參數(shù))
這七個參數(shù)類型分別為:
-
String
: 要獲取的圖片地址 -
Response.Listener<Bitmap>
: 獲取圖片成功的回調(diào) -
int
:maxWidth
,獲取圖片的最大寬度撤逢,會自動進(jìn)行壓縮或拉伸膛锭,設(shè)置為0捌斧,即獲取原圖 -
int
:maxHeight
,同上 -
ScaleType
:顯示的類型泉沾,居中捞蚂,平鋪等 -
Config
:圖片類型,如:Bitmap.Config.RGB_565
-
Response.ErrorListener
: 獲取圖片失敗的回調(diào)
2. 使用ImageLoader
緩存網(wǎng)絡(luò)圖片
使用ImageLoader
只需三步:
- 實(shí)例化ImageLoader
- 設(shè)置監(jiān)聽器
- 獲取圖片
代碼如下:
MainActivity.java
文件:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
//1.實(shí)例化ImageLoader
ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());
//2.設(shè)置監(jiān)聽器
ImageLoader.ImageListener listener =
ImageLoader.getImageListener(myImageView, R.drawable.ic_launcher, R.drawable.ic_launcher);
//3.獲取圖片
loader.get(url, listener);
BitmapCache.java
文件:
public class BitmapCache implements ImageLoader.ImageCache {
//LruCache對象
private LruCache<String, Bitmap> lruCache ;
//設(shè)置最大緩存為10Mb跷究,大于這個值會啟動自動回收
private int max = 10*1024*1024;
public BitmapCache(){
//初始化 LruCache
lruCache = new LruCache<String, Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return lruCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
lruCache.put(url, bitmap);
}
}
說明:
-
ImageLoader
構(gòu)造器需要兩個參數(shù)姓迅,requestQueue
是熟悉的請求隊(duì)列,imageCache
是圖片緩存對象俊马,需要自定義類實(shí)現(xiàn)imageCache
對象丁存。使用LruCache
來作為具體的圖片緩存對象。 -
ImageLoader.getImageListener()
需要三個參數(shù):ImageView
實(shí)例柴我,默認(rèn)的圖片資源解寝,錯誤顯示的圖片資源 -
ImageLoader
調(diào)用get(ImageURL, listener)
方法,獲取圖片
3. NetworkImageView的使用
layout_main.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/activity_horizontal_margin" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="獲取圖片"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/mNetworkImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
BitmapCache.java
文件:同“使用ImageLoader緩存網(wǎng)絡(luò)圖片”。
MainActivity.java
文件:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
//實(shí)例化ImageLoader
ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());
//設(shè)置默認(rèn)圖片
mNetworkImageView.setDefaultImageResId(R.drawable.ic_launcher);
//設(shè)置錯誤圖片
mNetworkImageView.setErrorImageResId(R.drawable.ic_launcher);
//設(shè)置圖片url和ImageLoader
mNetworkImageView.setImageUrl(url,loader);