【问题标题】:RXJava + Retrofit. Repeat request every n secondsRXJava + 改造。每 n 秒重复一次请求
【发布时间】:2017-03-06 00:03:34
【问题描述】:

在服务器成功响应后每隔 n 秒重复一次请求。但是查询时间中有一个字段,它改变了查询本身。 RepeatWhen - 不适合这个原因。告诉我,我该如何解决这个问题?谢谢)

  AtomicBoolean onComplete = new AtomicBoolean(true);
        Observable.interval(3, TimeUnit.SECONDS)
                .compose(rxSchedulersAbs.getIOToMainTransformer())
                .map(new Func1<Long, Observable<String>>() {
                    @Override
                    public Observable<String> call(Long tick) {
                        if (onComplete.get()) {
                            onComplete.set(false);
                            return requestCreator.getSyncMessage();
                        }
                        return null;
                    }
                }).map(sync -> {
            if (sync != null)
                onComplete.set(true);
            return sync;
        }).subscribe();

【问题讨论】:

    标签: android retrofit rx-java repeat


    【解决方案1】:

    如果您想根据服务器发回的内容更改请求的频率,我建议使用BehaviorSubject

    BehaviorSubject<Integer> delayObs = BehaviorSubject.create(3);
    delayObs
    .serialize()
    .flatMap(delay -> Observable.timer(delay, TimeUnit.SECONDS))
    .flatMap(dummy -> requestCreator.getSyncMessage())
    .onErrorResumeNext(e -> {
       if(e instanceof IOException) {
         delayObs.onNext(3);
         return Observable.empty();
       } else {
         return Observable.error(e);
       }
    }
    .doOnNext(sync -> {
        if(sync == null) {
          delayObs.onComplete();
        } else {
          delayObs.onNext(getNextInterval(sync));
        }
    }
    .compose(rxSchedulersAbs.getIOToMainTransformer())
    .subscribe();
    

    另一方面,如果您需要更改使用您刚收到的响应中的数据发出的请求,this might be useful

    【讨论】:

    • 感谢您的帮助。困难在于我需要每 3 秒组织一次池化,但是查询中的一个字段会发生变化。还需要检查最后一次请求是否成功,并从它添加 3 秒
    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2018-01-06
    • 2019-10-08
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多