手记

Volley框架之图片的缓存

Volley的图片缓存要LruCahe和ImageCahe结合。
Volley网咯加载图片有三种:
ImageRequest: 没有用到图片的缓存
ImageLoader: 用到了图片的缓存
NetworkImageView: 用到图片的缓存
首先也要和数据获取的一样,要增加一个请求队列。

第一步:配置请求队列

import android.app.Application;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class MyApplication extends Application {
public static RequestQueue queue;
@Override
public void onCreate() {
super.onCreate();
queue= Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueue(){
return queue;
}
}

请求队列完成以后,我们要把这个请求队列放在XML的清单文件里面。
直接android:name="写了请求队列的那个类的路径"
图片

对面还要加一个网络权限。
<uses-permission android:name="android.permission.INTERNET"/>

接下我们写一个XML的布局,里面放图片。

图片

第二步:我们先写ImageRequest来获取网咯图片。
private String url="http://www.baidu.com/img/bdlogo.png"; //图片的url
//第一个是图片的URL,第二个是图片加载成功的回调,第三个和第四个分别表示图片的宽度和高度(其 // 中为0,0表示原图的显示)
//第五个加载图片的格式,最后一个表示加载图片的错误

ImageRequest request =new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
iv_img.setImageBitmap(bitmap); //图片加载成功我们就把图片放到ImageView中
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
iv_img.setBackgroundResource(R.mipmap.ic_launcher);
}
});
MyApplication.getHttpQueue().add(request); //放到请求队列中。

第三步:我们来写ImageLoader来获取网咯图片。

//两个参数,第一个请求队列,第二个是缓存
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueue(),new BitmapCache());
//三个参数,第一个是控件ID,第二个是默认的加载图片,第三个是加载出错的图片
ImageLoader.ImageListener listener =ImageLoader.getImageListener(iv_img,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
loader.get(url,listener);//里面的有两个参数和四个参数,两个参数不会定义图片宽度和高度

 这里我们就要建立一个缓冲的类

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import com.android.volley.toolbox.ImageLoader;

public class BitmapCache implements ImageLoader.ImageCache {
public LruCache<String,Bitmap> cache;
public int max=1010241024;//缓存内存的大小,当超过缓存会自动清除
public BitmapCache(){
cache =new LruCache<String,Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String s) {
return cache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
cache.put(s,bitmap);
}
}

第四步:我们来写NetworkImageView来获取网咯图片。

private NetworkImageView networkImageView;

networkImageView= (NetworkImageView) findViewById(R.id.networkImageView);

//两个参数,第一个请求队列,第二是图片缓存
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueue(),new BitmapCache());
networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);//正在加载中一个图片
networkImageView.setErrorImageResId(R.mipmap.ic_launcher);//加载失败的图片
networkImageView.setImageUrl(url,loader);

2人推荐
随时随地看视频
慕课网APP