java 轮询 开源_在RxJava中使用“skipWhile”和“repeatWhen”来实现服务器轮询

本文介绍了如何在Android项目中利用RxJava的skipWhile和repeatWhen操作符实现服务器轮询。当服务器响应作业处理中时,skipWhile会返回true并延迟1秒再次请求,直到服务器响应完成或出错。文中提出了两个疑问:1.为何skipWhile未发出任何信号,repeatWhen仍能工作并间隔1秒重试?2.为何当skipWhile返回false时,重复不再进行?作者强调虽然RxJava是开源的,但理解其工作原理颇具挑战性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我真的很喜欢RxJava,它是一个很棒的工具,但有些时候很难理解它是如何工作的 . 我们在Android项目中使用Retrofit和RxJava,并且有以下用例:

我需要轮询服务器,重试之间有一些延迟,而服务器正在做一些工作 . 服务器完成后,我必须提供结果 . 所以我用RxJava成功完成了它,这里是代码片段:我用“skipWhile”和“repeatWhen”

Subscription checkJobSubscription = mDataManager.checkJob(prepareTweakJob)

.skipWhile(new Func1() {

@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>>() {

@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(){

@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是开源的,我只能阅读代码,但正如我所说 - 这真的很难理解 .

谢谢 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值