在我们的印象中,大多数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);
}
}
这里我做的是二级缓存,以上代码仅供参考,
本人菜鸟一个,有什么不对的地方,希望大家指出评论,大姐一起努力进步!