网络图片的二级缓存

在我们的印象中,大多数APP如果不是第一次进入,且没有链接到网络的情况下,里面的图片还是会显示的,这就是我们所说的缓存,那他们是如何做的呢?他们在一般都是在用户第一次进入的时候,将图片进行缓存,之后,当用户断开网络链接后,还是会看到图片,使用户体验更好!
现在我们来写一个缓存,一般都是新建一个包来存储这些缓存的类,如下,
这里写图片描述

首先是内存缓存:


/**
 * Created by anfeng on 16/6/13.
 * 内存缓存
 */
public class MemoryCache implements ImageLoader.ImageCache {

//LruCache 最近最少使用算法
private LruCache<String, Bitmap> caches;

public MemoryCache() {
super();
//获取手机的最大内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
//不能把手机中的所有内存都给图片的缓存,将手机中的内存的8分之1给图片做缓存,
        // 再除以1024,转换为kb,图片的大小一般都是xxkb
int maxSize = maxMemory / 8 / 1024;
//指定当前缓存所需要的最大内存
caches = new LruCache<String, Bitmap>(maxSize) {
//该括号中指定缓存的每一张图片多大,占多大内存
@Override
protected int sizeOf(String url, Bitmap bitmap) {
//每一行多少的字节 * 高度 / 1024  转换kb
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
            }
        };

    }


//获取
@Override
public Bitmap getBitmap(String url) {
return caches.get(url);
    }

//存储
@Override
public void putBitmap(String url, Bitmap itmap) {
caches.put(url,bitmap);
    }
}

然后是磁盘缓存:


/**
 * Created by anfeng on 16/6/13.
 * 磁盘缓存
 */
public class DiskMemory implements ImageLoader.ImageCache {

//设置路径
private static final String path = "/sdcard/Download/";
private FileOutputStream fos;

@Override
public Bitmap getBitmap(String url) {
//根据路径获取
return BitmapFactory.decodeFile(path + url + ".jpg");
    }

@Override
public void putBitmap(String url, Bitmap bitmap) {
        File file = new File(path);
//如果该文件不存在
if (!file.exists()) {
//创建
file.mkdir();
        }
//前面是路径,后面是名字
File imgFile = new File(path, url + ".jpg");
if (imgFile.exists()) {
try {
//如果图片不存在,创建该文件
imgFile.createNewFile();
//利用输出流,将图片存储到内存
fos = new FileOutputStream(imgFile);
//压缩,设置格式和品质,输出流是该Bitmap要去的方向
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
//关流
try {
fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

二级缓存:


/**
 * Created by anfeng on 16/6/13.
 * 二级缓存
 */
public class DoubleCache implements ImageLoader.ImageCache {

private ImageLoader.ImageCache memoryCache;
private ImageLoader.ImageCache dickCache;

//在构造方法中创建
public DoubleCache() {
super();
memoryCache = new MemoryCache();
dickCache = new DiskMemory();
    }

@Override
public Bitmap getBitmap(String url) {
//获取图片
if (memoryCache != null) {
return memoryCache.getBitmap(url);
        }
return dickCache.getBitmap(url);
    }

@Override
public void putBitmap(String url, Bitmap bitmap) {
//将图片存到内存与缓存中
memoryCache.putBitmap(url, bitmap);
dickCache.putBitmap(url, bitmap);
    }
}

最后使用就可以了,


public class MainActivity extends AppCompatActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//直接演示Volley的ImageLoader使用
RequestQueue requestQueue = Volley.newRequestQueue(this);
        ImageLoader imageLoader = new ImageLoader(requestQueue, new DoubleCache());
//加载图片的监听:参数1:imageView 参数2:默认的图片 参数3:加载失败的图片
ImageLoader.ImageListener listener = imageLoader.getImageListener(new ImageView(this), R.mipmap.ic_launcher, R.mipmap.ic_launcher);
//利用
imageLoader.get("图片网址", listener);
    }

}

这里我做的是二级缓存,以上代码仅供参考,
本人菜鸟一个,有什么不对的地方,希望大家指出评论,大姐一起努力进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值