Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.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
Android 如何使用rxjava2取消Observable.timer?_Android_Rx Java_Reactive Programming_Retrofit2_Rx Java2 - Fatal编程技术网

Android 如何使用rxjava2取消Observable.timer?

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

我的代码中有一个重试机制,我使用下面的行来执行我的重试逻辑。例如,我生成一个随机毫秒来延迟执行。当计时器计时到30*1000毫秒时,我想取消此计时器。如何取消此计时器并立即执行逻辑

//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()从侦听器逻辑添加注销
非常感谢您的解释。