Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.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 定期轮询后端API,在定期间隔内轮询一定次数-改装&;RxJava_Android_Retrofit2_Rx Java2 - Fatal编程技术网

Android 定期轮询后端API,在定期间隔内轮询一定次数-改装&;RxJava

Android 定期轮询后端API,在定期间隔内轮询一定次数-改装&;RxJava,android,retrofit2,rx-java2,Android,Retrofit2,Rx Java2,我希望以预定义的定期间隔轮询后端调用一定次数。如果在循环和更新UI之间收到预期的负载,我想退出循环,否则终止轮询 下面是我在进行标准http调用时通常执行的代码 //Response Model from backend API public class ApplicationStatusResponse { public boolean isActive; } //Retrofit facade @POST(v1/api/applicationStatus) Single<Appl

我希望以预定义的定期间隔轮询后端调用一定次数。如果在循环和更新UI之间收到预期的负载,我想退出循环,否则终止轮询

下面是我在进行标准http调用时通常执行的代码

//Response Model from backend API
public class ApplicationStatusResponse
{
public boolean isActive;
}

//Retrofit facade  
@POST(v1/api/applicationStatus)
Single<ApplicationStatusResponse> checkApplicationStatus(@Body ApplicationStatusRequest applicationRequest);


-----

DisposableSingleObserver<ApplicationStatusResponse> disposableSingleObserver = new DisposableSingleObserver<ApplicationStatusResponse>() {
    @Override
    public void onSuccess(ApplicationStatusResponse response) {
            // Update UI Here
    }

    @Override
    public void onError(Throwable e) {

    }
};

CompositeDisposable compositeDisposable = new CompositeDisposable();

// Following call works alaways works 
DisposableSingleObserver<ApplicationStatusResponse> disposable = originationRepo.checkApplicationStatus(applicationStatusRequest)
        .observeOn(schedulerProvider.mainThread())
        .subscribeWith(disposableSingleObserver);

compositeDisposable.add(disposable);
提前感谢您的帮助。

选项#1使用
filter
+
take(1)

选项2使用
Subject
+
takeUntil

Subject<Boolean> stopSubject = PublishSubject.create();
disposable = Flowable
            .interval(INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS)
            .takeUntil(stopSubject.asObservable())
            .map(x -> originationRepo.checkApplicationStatus(applicationStatusRequest))
            .take(POLL_COUNT) //YES
            .subscribe(
                response -> {
                    //update UI
                    boolean shouldStop = ... // calculate
                    if (shouldStop) {
                        stopSubject.onNext(true);
                    }
                }
            ...
             )
Subject stopSubject=PublishSubject.create();
一次性=可流动
.interval(初始延迟、轮询间隔、时间单位为毫秒)
.takeUntil(stopSubject.asObservable())
.map(x->originationRepo.checkApplicationStatus(applicationStatusRequest))
.take(POLL\u COUNT)//是
.订阅(
答复->{
//更新用户界面
布尔值shouldStop=…//计算
如果(应该停止){
stopSubject.onNext(true);
}
}
...
)
这是伪代码。我希望您能理解。

(在接下来的部分中,您还可以通过抛出自定义错误/异常来“短路”可观察对象)

备选案文3:
谢谢你的回复。我不确定我的方法是否正确,但似乎代码被复制了,并且在过滤器上出现了语法错误,您不需要
DisposableSingleObserver
。在
DisposableSingleObserver
中,直接放置“更新UI”代码。它将是您进行UI更新的唯一地方。在
map
中放置返回true或false的函数。一般做法是,不要在流中使用外部状态。阅读地图的工作原理:以及
filer
我的意思是“在
doOnNext
内直接放置“更新UI”代码。”
disposable = Flowable
            .interval(INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS)
            .map(x -> originationRepo.checkApplicationStatus(applicationStatusRequest))
            .take(POLL_COUNT) //YES
            .doOnNext() // update UI here
            .map(response -> ) // should stop condition. true - stop, false - continue
            .filter(!shouldContinue)
            .take(1)
Subject<Boolean> stopSubject = PublishSubject.create();
disposable = Flowable
            .interval(INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS)
            .takeUntil(stopSubject.asObservable())
            .map(x -> originationRepo.checkApplicationStatus(applicationStatusRequest))
            .take(POLL_COUNT) //YES
            .subscribe(
                response -> {
                    //update UI
                    boolean shouldStop = ... // calculate
                    if (shouldStop) {
                        stopSubject.onNext(true);
                    }
                }
            ...
             )
disposable = Flowable
        .interval(INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS)
        .map(x -> originationRepo.checkApplicationStatus(applicationStatusRequest)) // .flatMap (?)
        .take(POLL_COUNT) //YES
        .doOnNext() // update UI here
        .map(response -> {
           if(!response.checkCondition()) {
             throw new ShortCircuitException();
           }
             return response.data();
        })
        .onErrorResumeNext(throwable -> (throwable instanceof ShortCircuitException)
            ? Observable.empty()
            : Observable.error(throwable))