package com.hunterliy.library.cache; import com.hunterliy.library.bean.JsonBean; import rx.Observable; import rx.functions.Action1; import rx.functions.Func1; public class CacheManager { private ICache memoryCache,diskCache; private CacheManager(){ memoryCache = new MemoryCache(); diskCache = new DiskCache(); } public static final CacheManager getInstance(){ return LazyHolder.INSTANCE; } private static class LazyHolder { public static final CacheManager INSTANCE = new CacheManager(); } public <T extends JsonBean> Observable<T> load(String key,Class<T> clz,NetWorkCache<T> netWorkCache){ Observable observable = Observable.concat( loadFromMemory(key,clz), loadFromDisk(key,clz), loadFromNet(key,clz,netWorkCache)) .first(new Func1<T, Boolean>() { @Override public Boolean call(T t) { return t!=null&&!t.isExpire(); } }); return observable; } public <T extends JsonBean> Observable<T> loadFromMemory(String key,Class<T> clz){ return memoryCache.get(key,clz); } public <T extends JsonBean> Observable<T> loadFromDisk(final String key,Class<T> clz){ return diskCache.get(key,clz) .doOnNext(new Action1<T>(){ @Override public void call(T t) { if (null!=t) memoryCache.put(key,t); } }); } public <T extends JsonBean> Observable<T> loadFromNet(final String key,Class<T> clz,NetWorkCache<T> netWorkCache){ return netWorkCache.get(key,clz) .doOnNext(new Action1<T>() { @Override public void call(T t) { if (null!=t){ memoryCache.put(key,t); diskCache.put(key,t); } } }); } }