TCache

TCache是一个封装的Android缓存框架,使用具有很大的灵活性,下面将介绍该框架的使用方法和设计**
TCacheSamples

TCache使用方法

  • 获得TCache对象,默认是存储在 context.getCacheDir()tcache 目录下的.
  • 可以通过String类型的key缓存你想要缓存的数据,如Bitmap,JSONObject,String,byte[]等等.
  • 可以获得对应key缓存的数据是否过期
  • 可以清除指定key对应的缓存或清除所有缓存
  • 可以指定自定义的缓存目录,并管理缓存目录中文件的数量和缓存目录的空间.
  • 可以通过自定义的对象字节转换器,缓存你想缓存的对象数据,如Samples中缓存Intent

TCache获取方法和接口介绍

  • 1.获取TCache
  //通过Context获取对象
  public static TCache get(Context context)
  //通过Context,并指定缓存的根目录
  public static TCache get(Context context, String rootCacheDir)
  //通过Context,并指定缓存的根目录,缓存的相对目录
  public static TCache get(Context context, String rootCacheDir, String relativeCacheDir)
  //通过Context,缓存的根目录,缓存的相对目录,存储目录最多文件数,最大缓存目录空间
  public static TCache get(Context context, String rootCacheDir, String relativeCacheDir,
              int maxDiskTotalCount, int maxDiskTotalSpace)
  //通过Context,缓存的根目录,缓存的相对目录,存储目录最多文件数,最大缓存目录空间,指定缓存默认失效时间
  public static TCache get(Context context, String rootCacheDir, String relativeCacheDir,
              int maxDiskTotalCount, int maxDiskTotalSpace, int defCacheAge)
  • 2.TCache提供的缓存数据接口CacheManager,该接口标示这TCache提供了一些缓存数据和获取缓存的方法,如Bitmap,JSONObject等
interface CacheManager extends Cache {
  //缓存字节数组
  void putBytes(String key, byte[] bytes);
  //获取缓存的字节数组
  byte[] getBytes(String key);
  //缓存Bitmap
  void putBitmap(String key, Bitmap bitmap);
  //获取缓存的Bitmap
  Bitmap getBitmap(String key);
  //缓存序列化对象
  <T extends Serializable> void putSerializable(String key, T obj);
  //获取缓存的序列化对象
  <T extends Serializable> T getSerializable(String key);
  //缓存JSONObject
  void putJSONObject(String key, JSONObject obj);
  //获取缓存的JSONObject
  JSONObject getJSONObject(String key) throws JSONException;
}
  • 3.CacheManager的父接口Cache,该接口标示了TCache提供的对象字节转换器来缓存任一对象,TCache判读指定缓存是否过期和清除操作
interface Cache {
    //通过字节转换器缓存对象
    <T> void putByteMapper(String key, T obj, ByteMapper<T> mapper);
    //通过字节转换器获取缓存的对象
    <T> T getByteMapper(String key, ByteMapper<T> mapper);
    //通过默认的有效缓存周期判断指定的对象是否过期
    boolean isExpired(String key);
    //通过指定的的有效缓存周期判断指定的对象是否过期
    boolean isExpired(String key, long age);
    //清除指定的缓存
    void evict(String key);
    //清除所有缓存
    void evictAll();
    //是否有指定key的缓存
    boolean isCached(String key);
}
  • 4.对象字节转换器接口ByteMapper,通过该接口可以完成任意对象和字节数组的相互转换
public interface ByteMapper<T> {
    //通过对象获取字节数组
    byte[] getBytes(T obj);
    //通过字节数组获取对象
    T getObject(byte[] bytes);
}
  • 5.TCache提供了几个默认的字节转换器,如bitmap等
public class BitmapByteMapper implements ByteMapper<Bitmap> {

    BitmapByteMapper() {
        
    }

    @Override
    public byte[] getBytes(Bitmap bitmap) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
        return bos.toByteArray();
    }

    @Override
    public Bitmap getObject(byte[] bytes) {
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }
}

TCache的设计**

  • 缓存目录管理
    TCache采用分目录管理的方式管理不同位置的缓存,比如默认的tcache目录,tcache默认的缓存空间是50M,默认的缓存文件数量是500个,生命是不限的.TCache可以同时管理多个相对缓存目录,这些目录和tcache目录的性质是一样的.
  • 数据如何持久存储
    TCache会将指定key的数据用一个目录层文件的方式换出起来
  • 如何缓存任意数据
    如何缓存任一数据,因为任何数据在计算机上都是以字节的形式存储的,因此TCache设计了字节对象转换器,这样用户就可以自己扩展自己想存储的数据了,比如Samples中的Intent对象.
  • 写文件
    TCache采用nio的方式进行读写文件,比寻常的io stream更高效.
  • 二级缓存
    为了提高缓存的读取效率,设计了二级缓存,将暂时使用的缓存数据会缓存到内存中.
  • 缓存过期机制
    如上所述,每个key对应的数据就是一个文件,那么这个数据文件的last modified time就是文件最后的缓存时间,TCache会修改该缓存文件对应父目录的last modified time时间,TCache会根据这个时间去判读是否过期,比如缓存了一个key为"xxx/yyy/zzz"的数据"ABCD",也可以获得key"xxx"的缓存是否过期,这样可以对相同类型的数据进行用户指定的缓存过期判断.
  • 缓存清除
    同上的过期机制,缓存清除一个清除指定的目录或文件
  • 线程控制
    因为缓存数据到disk上是通常的IO操作,所以TCache在put时对线程进行判断,防止在主线程进行Cache操作.

TCache总结

TCache是一个方便缓存数据的实用框架,便于扩展;但也有不足,欢迎大家提出issues指正交流,不胜感激!!!