RxJava为android构建具有可观察性的缓存
我很难理解如何使用RxJava构建缓存。其想法是,我需要从内存缓存中获取数据,或者从数据库(dynamoDb)加载数据。但是,这个缓存应该在片段和/或线程之间共享。因此,我需要返回当前正在运行但尚未完成的现有观测值。这允许线程赶上进度,而不做不必要的工作。我是RxJava新手,所以这是我心目中的草图(为了简洁起见,遗漏了一些代码):RxJava为android构建具有可观察性的缓存,java,android,caching,rx-java,Java,Android,Caching,Rx Java,我很难理解如何使用RxJava构建缓存。其想法是,我需要从内存缓存中获取数据,或者从数据库(dynamoDb)加载数据。但是,这个缓存应该在片段和/或线程之间共享。因此,我需要返回当前正在运行但尚未完成的现有观测值。这允许线程赶上进度,而不做不必要的工作。我是RxJava新手,所以这是我心目中的草图(为了简洁起见,遗漏了一些代码): 公共类DBCache{ private final ConcurrentHashMap resultCache=新ConcurrentHashMap; 私有最终Co
公共类DBCache{
private final ConcurrentHashMap resultCache=新ConcurrentHashMap;
私有最终ConcurrentHashMap observableCache=新ConcurrentHashMap;
私有可观察getFromCache(最终DynamoDbCacheKey查询){
返回Observable.create(newobservable.OnSubscribe(){
@凌驾
public void call(订户这里是一个缓存和检索一次值的简单示例:
public class RxCache<K, V> {
final ConcurrentHashMap<K, AsyncSubject<V>> cache;
final Func1<K, Observable<V>> valueGenerator;
public RxCache(Func1<K, Observable<V>> valueGenerator) {
this.valueGenerator = valueGenerator;
this.cache = new ConcurrentHashMap<>();
}
public Observable<V> get(K key) {
AsyncSubject<V> o = cache.get(key);
if (o != null) {
return o;
}
o = AsyncSubject.create();
AsyncSubject<V> p = cache.putIfAbsent(key, o);
if (p != null) {
return p;
}
valueGenerator.call(key).subscribe(o);
return o;
}
public void remove(K key) {
cache.remove(key);
}
}
公共类RxCache{
最终ConcurrentHashMap缓存;
最终Func1值生成器;
公共RxCache(Func1值生成器){
this.valueGenerator=valueGenerator;
this.cache=新的ConcurrentHashMap();
}
公共可观测get(K键){
AsyncSubject o=cache.get(key);
如果(o!=null){
返回o;
}
o=AsyncSubject.create();
AsyncSubject p=cache.putIfAbsent(键,o);
如果(p!=null){
返回p;
}
valueGenerator.call(键)、subscribe(o);
返回o;
}
公共无效删除(K键){
缓存。删除(键);
}
}
如果您有多个值,请将AsyncSubject
替换为ReplaySubject
您可以使用BehaviorSubject
应用缓存,您创建一个可观察的,然后将其转换为BehaviorSubject
,然后订阅此Subject
,以获取数据
现在,这个主题
将作为一个可观察的
反应,当订阅时,它将为您提供获取的最新数据,并在更新时发出新数据
请参见此处的更多详细信息和实施:
另一种方法:
通过简单示例了解有关主题的更多信息:
public class RxCache<K, V> {
final ConcurrentHashMap<K, AsyncSubject<V>> cache;
final Func1<K, Observable<V>> valueGenerator;
public RxCache(Func1<K, Observable<V>> valueGenerator) {
this.valueGenerator = valueGenerator;
this.cache = new ConcurrentHashMap<>();
}
public Observable<V> get(K key) {
AsyncSubject<V> o = cache.get(key);
if (o != null) {
return o;
}
o = AsyncSubject.create();
AsyncSubject<V> p = cache.putIfAbsent(key, o);
if (p != null) {
return p;
}
valueGenerator.call(key).subscribe(o);
return o;
}
public void remove(K key) {
cache.remove(key);
}
}