Android 如何使用rxjava2取消Observable.timer?
我的代码中有一个重试机制,我使用下面的行来执行我的重试逻辑。例如,我生成一个随机毫秒来延迟执行。当计时器计时到30*1000毫秒时,我想取消此计时器。如何取消此计时器并立即执行逻辑Android 如何使用rxjava2取消Observable.timer?,android,rx-java,reactive-programming,retrofit2,rx-java2,Android,Rx Java,Reactive Programming,Retrofit2,Rx Java2,我的代码中有一个重试机制,我使用下面的行来执行我的重试逻辑。例如,我生成一个随机毫秒来延迟执行。当计时器计时到30*1000毫秒时,我想取消此计时器。如何取消此计时器并立即执行逻辑 //register retryWhen Observable.retryWhen(new RetryWhenException()); //retry code. public class RetryWhenException implements Function<Observable<? exte
//register retryWhen
Observable.retryWhen(new RetryWhenException());
//retry code.
public class RetryWhenException implements Function<Observable<? extends Throwable>, Observable<?>>{
public Observable<?> apply(final Observable<? extends Throwable> observable) throws Exception {
return observable.zipWith(Observable.range(1, count + 1), new BiFunction<Throwable, Integer, Wrapper>() {
@Override
public Wrapper apply(Throwable throwable, Integer integer) throws Exception {
return new Wrapper(throwable, integer);
}
}).flatMap(new Function<Wrapper, Observable<?>>() {
@Override
public Observable<?> apply(Wrapper wrapper) throws Exception {
long delay = 60 * 1000;
//How can I add some code here to cancel this time and execute this api call immediately if I receive a event like network gets back?
return Observable.timer(delay, TimeUnit.MILLISECONDS);
}
});
}
}
//注册retryWhen
可观察。retryWhen(新RetryWhenException());
//重试代码。
公共类RetryWhenException实现函数>{
公共可观察应用(最终可观察>(){
@凌驾
公共可观察应用程序(包装器)引发异常{
长延时=60*1000;
//我如何在这里添加一些代码来取消这次调用,并在收到类似network Get back的事件时立即执行此api调用?
返回可观察计时器(延迟,时间单位,毫秒);
}
});
}
}
提前感谢。如果我正确理解了您的问题,您希望能够将多个条件组合到重试中,这意味着重试将在最多一定时间(计时器)后发生,或者在某些事件发生(网络已连接)后甚至更早发生。
在这种情况下,您需要组合这两个事件,首先,您需要一些通知网络事件的
Observable
(如何创建它是一个不同的讨论,用Observable包装系统广播事件不应该是一个问题),然后您可以这样做:
private Observable<NetworkState> networkStateObservable;
public class RetryWhenException implements Function<Observable<? extends Throwable>, Observable<?>> {
public Observable<?> apply(
final Observable<? extends Throwable> observable) throws Exception {
return observable.zipWith(Observable.range(1, count + 1), Wrapper::new)
.flatMap(wrapper -> {
long delay = 60 * 1000;
Observable<NetworkState> networkConnectedEvents =
networkStateObservable.filter(networkState -> networkState.isConnected())
take(1);
Observable<Long> timer = Observable.timer(delay, TimeUnit.MILLISECONDS);
return Observable.amb(Arrays.asList(networkConnectedEvents, timer));
});
}
}
私有可观测网络状态可观测;
公共类RetryWhenException实现函数>{
公众可观察应用(
final Observable非常感谢您的回复。这正是我想要的。我创建了一个网络可观察包装器,正如您所描述的,
似乎networkStateObservable在调用onNetworkChanged()后没有发出(state.isConnected()为true)。
如何使networkStateObservable正确发射?非常感谢。
我在电话里打了个电话
e.onNext(state);
e.onComplete();
我发出networkStateObservable是错误的吗
Observable<NetworkState> networkStateObservable = getNetworkObservableWrapper();
public Observable<NetworkState> getNetworkObservableWrapper() {
return Observable.create(new ObservableOnSubscribe<NetworkState>() {
@Override
public void subscribe(final ObservableEmitter<NetworkState> e) throws Exception {
final NetworkChangedListener listener = new NetworkChangedListener() {
@Override
public void onNetworkChanged(NetworkState state) {
//Below lines were called, but Observable.amb(Arrays.asList(networkConnectedEvents, timer)); didn't work.
e.onNext(state);
e.onComplete();
}
};
registerNetworkChanged(listener);
}
});
}
Observable networkStateObservable=getNetworkObservableWrapper();
公共可观测getNetworkObservableWrapper()的{
返回Observable.create(newobservableOnSubscribe(){
@凌驾
public void subscribe(最终可观察提交者e)引发异常{
最终NetworkChangedListener侦听器=新NetworkChangedListener(){
@凌驾
公共无效onNetworkChanged(网络状态){
//调用了下面的行,但可观察到.amb(Arrays.asList(networkConnectedEvents,timer));不起作用。
e、 onNext(州);
e、 onComplete();
}
};
registerNetworkChanged(侦听器);
}
});
}
你好,yosriz,你能帮我看看我应该如何正确地发出networkStateObservable吗?我在下面发布了我的代码。非常感谢。它似乎是由.takeUntil(networkConnectedEvents)引起的。如果我删除了这一行,效果很好。是的,实际上我错放了,我从答案中删除了它,amb会取消它(如果需要,从计时器取消订阅)猜测问题:如果您的registerNetworkChanged()
覆盖现有的网络更改侦听器,则可能发生的情况是此可观察对象订阅了两次(一次在amb,另一次在takeUntil)因此,第二个takeUntil可能会覆盖现有的侦听器。根据我对根本原因的猜测,很少有注释,a)当您注册到网络更改事件时,添加一个侦听器,而不是设置b)此外,您应该使用ObservableEmitter.setCancelable()从侦听器逻辑添加注销
非常感谢您的解释。