Android文件缓存管理

gitHub地址

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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值