RxCache 的代码分析,含缓存时间duration的在代码中改变的自己实现的机制

当应用进程创建 RxCache 的实例后,会给应用进程返回一个 rxcache实例及一个 ProxyProvider,代码如下:

CacheProviders providers = new RxCache.Builder().persistence(cacheDirectory).using(CacheProviders.class);

using之前的代码返回的就是 rxcache 实例, using返回的是一个proxy实例。

这句调用会进入了rxcache的源码实现里,using的实现代码会创建一个 ProxyProviders,它是一个 InvocationHandler, 将代理执行 CacheProviders 的所有函数调用,具体代理是ProxyProviders类的invoke调用,例如外部应用程序调用CacheProviders.getDataFromUrl(),则会立即被ProxyProviders类的invoke截获,将invode的第一个参数赋值为外部发起调用的object,将invoke的第二个参数赋值为调用的函数getDataFromUrl,将invoke的第三个参数赋值为外部调用的调用参数。

创建这个 ProxyProviders 的过程中就会创建一个 ProxyTranslator,这个proxytranslator就会调用 getLifeTimeCache 从annotation初始化duration。

之后,若数据从外部获取成功,这个lifetime会被传送到TwoLayersCache的save()调用里,继而传送到SaveRecord的save调用,最后被存到持久化(lifetime一并被持久化,持久化采用的是json格式)。

获取数据的时候,会调用ProcessorProvidersBehaviour的getData,然后调用TwoLayersCache的retrieve,然后调用 RetrieveRecordretrieveRecord,在这个调用里,先从持久化里获取到先前保存的Record(包括先前的lifetime),但是从annotation传过来的lifetime会将Record从持久化里获取的lifetime替换掉,然后利用这个lifetime检查缓存是否过期。

我们可以将 RxCache->ProxyProviders->ProxyTranslator 的传递过程添加一个修改lifetime的接口,让外部可以定义ProxyTranslator的getLifeTimeCache函数,这样达到随时修改lifetime的目的。

 

posted @ 2016-10-20 14:45  微信公众号--共鸣圈  阅读(1346)  评论(0编辑  收藏  举报