【发布时间】:2016-04-28 21:04:11
【问题描述】:
我真的很喜欢 RxJava,它是一个很棒的工具,但有时很难理解它是如何工作的。 我们在我们的 Android 项目中使用带有 RxJava 的 Retrofit,并且有以下用例:
我需要轮询服务器,重试之间有一些延迟,而服务器正在做一些工作。服务器完成后,我必须提供结果。所以我已经用 RxJava 成功完成了,这里是代码 sn-p: 我将“skipWhile”与“repeatWhen”一起使用
Subscription checkJobSubscription = mDataManager.checkJob(prepareTweakJob)
.skipWhile(new Func1<CheckJobResponse, Boolean>() {
@Override
public Boolean call(CheckJobResponse checkJobResponse) {
boolean shouldSkip = false;
if (SHOW_LOGS) Logger.v(TAG, "checkJob, skipWhile, jobStatus " + checkJobResponse.getJobStatus());
switch (checkJobResponse.getJobStatus()){
case CheckJobResponse.PROCESSING:
shouldSkip = true;
break;
case CheckJobResponse.DONE:
case CheckJobResponse.ERROR:
shouldSkip = false;
break;
}
if (SHOW_LOGS) Logger.v(TAG, "checkJob, skipWhile, shouldSkip " + shouldSkip);
return shouldSkip;
}
})
.repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Void> observable) {
if (SHOW_LOGS) Logger.v(TAG, "checkJob, repeatWhen " + observable);
return observable.delay(1, TimeUnit.SECONDS);
}
}).subscribe(new Subscriber<CheckJobResponse>(){
@Override
public void onNext(CheckJobResponse response) {
if (SHOW_LOGS) Logger.v(TAG, "checkJob, onSuccess, response " + response);
}
@Override
public void onError(BaseError error) {
if (SHOW_LOGS) Logger.v(TAG, "checkJob, onError, canEditTimeline, error " + error);
Toast.makeText(ChoseEditOptionActivity.this, R.string.NETWORK__no_internet_message, Toast.LENGTH_LONG).show();
}
@Override
public void onCompleted() {
if (SHOW_LOGS) Logger.v(TAG, "onCompleted");
}
});
代码运行良好:
当服务器响应该作业正在处理时,我从“skipWhile”链返回“true”,原始 Observable 等待 1 秒并再次执行 http 请求。 这个过程一直重复,直到我从“skipWhile”链返回“false”。
这里有一些我不明白的地方:
我在“skipWhile”的文档中看到它不会从原始 Observable 发出任何东西(onError、onNext、onComplete),直到我从它的“call”方法返回“false”。所以如果它没有发出任何东西,为什么“repeatWhen”Observable 会起作用呢?它等待一秒钟并再次运行请求。谁启动它?
第二个问题是:为什么“repeatWhen”中的 Observable 不会永远运行,我的意思是为什么当我从“skipWhile”返回“false”时它会停止重复?如果我返回“false”,我会在订阅者中成功获取 onNext。
在“repeatWhile”的文档中,它说最终我在订阅者中收到了对“onComplete”的调用,但从未调用过“onComplete”。
如果我改变链接“skipWhile”和“repeatWhen”的顺序没有区别。这是为什么呢?
我知道 RxJava 是开源的,我可以阅读代码,但正如我所说 - 这真的很难理解。
谢谢。
【问题讨论】:
标签: android networking retrofit rx-java long-polling