1、CacheManager缓存管理类,该类用Map缓存了文件目录及该目录对应的缓存管理器key:dirPath value:DiskCache
为了节省内存,把缓存写入同一个目录,这样Map只会缓存一个键值对
package xxx.cache;
import android.text.TextUtils;
import java.util.HashMap;
import java.util.Map;
/**
* 文件缓存管理
* Created by xxx on 2018/3/20
*/
public class CacheManager {
private static CacheManager mCacheManager;
//每个文件夹下对应一个单例管理类,统一文件操作入口,避免多个入口导致并发问题
private static Map<String, DiskCache> mControllMap = new HashMap<>();
private CacheManager() {}
public static CacheManager getInstance() {
if (mCacheManager == null) {
synchronized (CacheManager.class) {
if (mCacheManager == null) {
mCacheManager = new CacheManager();
}
}
}
return mCacheManager;
}
public DiskCache getDiskCache(String cacheDir, long maxSize) {
if (TextUtils.isEmpty(cacheDir)) {
throw new RuntimeException("cacheDir is null");
}
if (maxSize == 0) {
throw new RuntimeException("max size must > 0");
}
String key = cacheDir + myPid();
DiskCache controll = mControllMap.get(key);
if (controll == null) {
controll = DiskCache.getInstance(cacheDir, maxSize);
mControllMap.put(key, controll);
}
return controll;
}
public DiskCache getDiskCache() {
String key = FileCache.FILE_DIR + myPid();
DiskCache controll = mControllMap.get(key);
if (controll == null) {
controll = DiskCache.getInstance(FileCache.FILE_DIR, AutoClearController.MAX_SIZE);
mControllMap.put(key, controll);
}
return controll;
}
private String myPid() {
return "_" + android.os.Process.myPid();
}
}
2、DiskCache某个目录对应的缓存管理器,包含自动清理控制器AutoClearController、异步文件操作器AsyncFileCache
package xxx.cache;
import java.io.File;
import java.io.Serializable;
import xxx.common.utils.XLogUtil;
/**
* 1、记录文件大小,达到上限时删除最老的文件
* 2、文件读写
* Created by xxx on 2018/3/19
*/
public class DiskCache {
private static final String TAG = "DiskCache";
private static DiskCache mDiskCache;
private AutoClearController mAutoClearController;
private AsyncFileCache mAsyncFileCache;
private DiskCache() {
}
private DiskCache(String cacheDir, long maxSize) {
mAsyncFileCache = new AsyncFileCache(cacheDir);
mAutoClearController = new AutoClearController(cacheDir, maxSize) {
@Override
boolean deleteFile(File file) {
XLogUtil.d(TAG, "~~~~deleteFile " + file == null ? null : file.getAbsolutePath() + "~~~~");
return mAsyncFileCache != null && mAsyncFileCache.deleteFile(file);
}
};
mAsyncFileCache.setAutoClearController(mAutoClearController);
}
public static DiskCache getInstance(String cacheDir, long maxSize) {
if (mDiskCache == null) {
synchronized (DiskCache.class) {
if (mDiskCache == null) {
mDiskCache = new DiskCache(cacheDir, maxSize);
}
}
}
return mDiskCache;
}
public void setAutoClearEnable(boolean enable) {
if (mAutoClearController != null) {
mAutoClearController.setAutoClearEnable(enable);
}
XLogUtil.d(TAG, "~~~~setAutoClearEnable: " + enable + "~~~~");
}
public void put(String key, byte[] value) {
if (mAsyncFileCache != null) {
mAsyncFileCache.asyncPut(key, value);
}
XLogUtil.d(TAG, "~~~~put: " + key + "~~~~");
}
public void putObject(String key, Serializable value) {
if (mAsyncFileCache != null) {
mAsyncFileCache.asyncPutObject(key, value);
}
XLogUtil.d(TAG,"~~~~putObject: " + key + "~~~~");
}
public void get(String key, AsyncCallback callback) {
if (callback == null) {
return;
}
if (mAsyncFileCache != null) {
mAsyncFileCache.asyncGet(key, callback);
}
XLogUtil.d(TAG, "~~~~get: " + key + "~~~~");
}
public void getObject(String key, AsyncCallback callback) {
if (callback == null) {
return;
}
if (mAsyncFileCache != null) {
mAsyncFileCache.asyncGetObject(key, callback);
}
XLogUtil.d(TAG,"~~~~getObject: " + key + "~~~~");
}
public void remove(String key) {
if (mAsyncFileCache != null) {
mAsyncFileCache.as