Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava为android构建具有可观察性的缓存_Java_Android_Caching_Rx Java - Fatal编程技术网

RxJava为android构建具有可观察性的缓存

RxJava为android构建具有可观察性的缓存,java,android,caching,rx-java,Java,Android,Caching,Rx Java,我很难理解如何使用RxJava构建缓存。其想法是,我需要从内存缓存中获取数据,或者从数据库(dynamoDb)加载数据。但是,这个缓存应该在片段和/或线程之间共享。因此,我需要返回当前正在运行但尚未完成的现有观测值。这允许线程赶上进度,而不做不必要的工作。我是RxJava新手,所以这是我心目中的草图(为了简洁起见,遗漏了一些代码): 公共类DBCache{ private final ConcurrentHashMap resultCache=新ConcurrentHashMap; 私有最终Co

我很难理解如何使用RxJava构建缓存。其想法是,我需要从内存缓存中获取数据,或者从数据库(dynamoDb)加载数据。但是,这个缓存应该在片段和/或线程之间共享。因此,我需要返回当前正在运行但尚未完成的现有观测值。这允许线程赶上进度,而不做不必要的工作。我是RxJava新手,所以这是我心目中的草图(为了简洁起见,遗漏了一些代码):

公共类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);
    }
}