系列文章
Glide手写实现之资源封装
Glide手写实现之活动缓存
Glide手写实现之内存缓存
Glide手写实现之磁盘缓存
Glide手写实现之生命周期关联
Glide手写实现之网络图片加载实现
Glide手写实现之复用池
封装资源
封装资源的目的是为了给缓存使用方便管理。
Key
/**
* 唯一的描述
*/
public class Key {
private String key; // 例如:ac037ea49e34257dc5577d1796bb137dbaddc0e42a9dff051beee8ea457a4668
/**
* sha256(https://cn.bing.com/sa/simg/hpb/LaDigue_EN-CA1115245085_1920x1080.jpg)之前
* ac037ea49e34257dc5577d1796bb137dbaddc0e42a9dff051beee8ea457a4668 处理后
* @param key
*/
public Key(String key) {
//this.key = key;
key = Tool.getSHA256StrJava(key);
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
Value
/**
* 对Bitmap的封装
*/
public class Value {
private final String TAG = Value.class.getSimpleName();
// 单利模式
private static Value value;
public static Value getInstance() {
if (null == value) {
synchronized (Value.class) {
if (null == value) {
value = new Value();
}
}
}
return value;
}
private Bitmap mBitmap;
// 使用计数
private int count;
// 监听
private ValueCallback callback;
// 定义key
private String key;
public Bitmap getmBitmap() {
return mBitmap;
}
public void setmBitmap(Bitmap mBitmap) {
this.mBitmap = mBitmap;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public ValueCallback getCallback() {
return callback;
}
public void setCallback(ValueCallback callback) {
this.callback = callback;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
/**
* TODO 使用一次 就 加一
*/
public void useAction() {
Tool.checkNotEmpty(mBitmap);
if (mBitmap.isRecycled()) { // 已经被回收了
Log.d(TAG, "useAction: 已经被回收了");
return;
}
Log.d(TAG, "useAction: 加一 count:" + count);
count ++;
}
/**
* TODO 使用完成(不使用) 就 减一
* count -- <= 0 不再使用了
*/
public void nonUseAction() {
if (count -- <= 0 && callback != null) {
// 回调告诉外界,不再使用了
callback.valueNonUseListener(key, this);
}
Log.d(TAG, "useAction: 减一 count:" + count);
}
/**
* TODO 释放
*/
public void recycleBitmap() {
if (count > 0) {
Log.d(TAG, "recycleBitmap: 引用计数大于0,证明还在使用中,不能去释放...");
return;
}
if (mBitmap.isRecycled()) { // 被回收了
Log.d(TAG, "recycleBitmap: mBitmap.isRecycled() 已经被释放了...");
return;
}
mBitmap.recycle();
value = null;
System.gc();
}
}
ValueCallback
/**
* 专门给Value,不再使用了,的回调接口
*/
public interface ValueCallback {
/**
* 监听的方法(Value不再使用了)
* @param key
* @param value
*/
public void valueNonUseListener(String key, Value value);
}