我正在尝试在应用中使用 RoboSpice + Retrofit + Jackson 。当我打开一个活动时,我想检查资源是否已经被缓存,如果是,只需更新视图,否则,发出新请求并等待答案。所有这一切都运行正常,但我注意到getFromCache()
方法需要花费很多时间。
我使用LRUCache实现了缓存(通过修改默认的Retrofit persister),如下所示:
@Override
public <T> ObjectPersister<T> createObjectPersister(Class<T> clazz) throws CacheCreationException {
try {
return new LruCacheObjectPersister<T>(new RetrofitObjectPersister<T>(getApplication(), converter, clazz), new LruCache<Object, CacheItem<T>>(20)); // TODO: Set a max size
} catch (CacheCreationException e) {
throw new RuntimeException("Could not create cache for class '" + clazz.getName() + "'", e);
}
}
正如我所说,缓存工作正常,我调试了所有内容并且正在按预期使用LRUCache,以及实际上是磁盘缓存的RetrofitObjectPersister
。
话虽如此,我的问题是:
即使对象在内存缓存中,getFromCache()
方法需要花费大量时间,这是正常的吗?我理解从磁盘缓存中检索的对象应该是值得注意的,但我不明白为什么从内存中获取对象需要很长时间?这可能与 RoboSpice 的服务架构有关吗?
非常感谢任何帮助。
非常感谢,
马托
答案 0 :(得分:0)
你花了很多时间是什么意思?你能给出数字(也许比较数字与你的缓存装饰器,没有它)?
由于RS的设计总是从Android服务内部执行异步代码,因此它们可能是开销。基本上,在缓存中获取内容的往返是:
SpiceManager -> SpiceService -> ExecutorService -> Thread -> CacheManager
<- <- <- <-
这肯定有点贵,但RS的设计。通常开销只有几毫秒。