RxCache配合retrofit使用的缓存方案
首先看一下rxcache的官方demo
/**
* 此为RxCache官方Demo
*/
public interface CacheProviders {
@LifeCache(duration = 2, timeUnit = TimeUnit.MINUTES)
Observable<Reply<List<Repo>>> getRepos(Observable<List<Repo>> oRepos, DynamicKey userName, EvictDynamicKey evictDynamicKey);
@LifeCache(duration = 2, timeUnit = TimeUnit.MINUTES)
Observable<Reply<List<User>>> getUsers(Observable<List<User>> oUsers, DynamicKey idLastUserQueried, EvictProvider evictProvider);
Observable<Reply<User>> getCurrentUser(Observable<User> oUser, EvictProvider evictProvider);
}
接下来我们看一下RxCache的初始化
CacheProviders cacheProviders = new RxCache.Builder()
.persistence(cacheDir, new GsonSpeaker())
.using(CacheProviders.class);
关于rxache的一些基本使用请参考下文
https://www.jianshu.com/p/b58ef6b0624b
进入源码之前我们首先思考一下这么几个问题,
1,通过上面的例子我们可以看出rxchace通过注解的方式定义了接口方法,那么它是在什么地方具体实现的
2,既然是缓存,它都有哪些缓存策略
接下来我们进入RxCache类的using方法看下这个方法都干了些什么
下面看下源码
public <T> T using(final Class<T> classProviders) {
proxyProviders = new ProxyProviders(builder, classProviders);
return (T) Proxy.newProxyInstance(
classProviders.getClassLoader(),
new Class<?>[] {classProviders},
proxyProviders);
}
从这里我们可以看出,这里是通过动态代理的方式,返回了一个执行对象,这个对象就是传入的接口的具体实现类。关于不了解动态代码机制的自行研究学习
接下来,我们进入ProxyProviders,ProxyProviders继承InvocationHandler,这个类是动态代理的关键类,主要方法是invoke,进入ivoke方法
@Override public Object invoke(final Object proxy, final Method method, final Object[] args)
throws Throwable {
return Observable.defer(new Callable<ObservableSource<?>>() {
@Override public ObservableSource<?> call() throws Exception {
Observable observable = proce