gpt4 book ai didi

java - RxJava-缓存直到排放闲置一段时间?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:32 24 4
gpt4 key购买 nike

我经常遇到一种模式,但我不太确定如何有效地绕过它。

基本上,如果我有一个 Observable<T>拿着贵重元素T , 我不想重新构建 T项目每次使用它时,或者将它映射到一千个不同的其他可观察对象,这将导致它被构建 1000 次。

所以我开始使用 replay()将其缓存一段时间,但理想情况下,我希望它在排放闲置一段时间后清除缓存。

是否有我可以使用的运算符或转换器来完成此操作?

public final class ActionManager {

private final Observable<ImmutableList<Action>> actionMap;

private ActionManager() {
this.actionMap = Observable.defer(() -> buildExpensiveList()).replay(10, TimeUnit.SECONDS).autoConnect();
}

//this method could get called thousands of times
//I don't want to rebuild the map for every call

public Observable<Action> forItem(Item item) {
actionMap.map(l -> //get Action for item);
}


}

更新

尝试将其实现为 Transformer/Operator 组合。我在这里做错了什么吗?

   public static <T> Transformer<T,T> recacheOnIdle(long time, TimeUnit timeUnit) { 

return obs -> obs.timeout(time, timeUnit).lift(new Operator<T,T>() {

private volatile T cachedItem;
private volatile boolean isCurrent = false;

@Override
public Subscriber<? super T> call(Subscriber<? super T> s) {
return new Subscriber<T>(s) {
@Override
public void onCompleted() {
if(!s.isUnsubscribed()) {
s.onCompleted();
}
}
@Override
public void onError(Throwable e) {
if(!s.isUnsubscribed()) {
if (e instanceof TimeoutException) {
isCurrent = false;
cachedItem = null;
} else {
s.onError(e);
}
}
}

@Override
public void onNext(T t) {
if(!s.isUnsubscribed()) {
if (!isCurrent) {
cachedItem = t;
}
s.onNext(cachedItem);
}
}
};
}

});
}

最佳答案

您可以使用 timeout operator和一个 connectable observable (保持和同步多个订阅者):

mirror the source Observable, but issue an error notification if a particular period of time elapses without any emitted items

通过这种方式,您可以通过重新缓存昂贵的项目来响应抛出的错误。假设这是一个“罕见”的案例:

// if no emissions are made for a period of 3 seconds - will call onError
observableWithCache.timeout(3000, TimeUnit.MILLISECONDS).subscribe(new Subscriber<SomeObject>() {

public void onCompleted() {

}

public void onError(Throwable arg0) {
doClearCache(); // make sure to re-subscribe with timeout
}

public void onNext(SomeObject item) {
System.out.println("Got item: " + item); // you can ignore this
}
});

请注意,onError 不会取消原始可观察对象,如图所示:

enter image description here

但是您可以对没有排放的时间段使用react。

关于java - RxJava-缓存直到排放闲置一段时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32849186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com