我有一个Rx流,每当某个事件发生时,它会依次执行两个动作:
将SMS发送到给定的一组数字-返回Single<Holster>
将事件保存在本地数据库中-返回Completable
这是我的代码
private void saveBluetoothAlarm(@NonNull Alarm alarm, int type) {
disposable.add( dbManager.getHolsterDAO().getCurrentHolster()
.map(holsters -> holsters.get(0))
.observeOn(AndroidSchedulers.mainThread())
.flatMap(holster -> sendSmsToAll(holster, alarm.type))
.observeOn(Schedulers.io())
.flatMapCompletable(holster -> {
switch (alarm.type) {
case StatisticsEventType.EXTRACTION:
if (something)
return Completable.complete();
else
return Completable.fromAction(() -> dbManager.getAlarmDAO().insert(alarm))
.andThen(saveAlarmOnServer(holster.getId(), alarm));
case StatisticsEventType.MOVEMENT:
if (somethingMore)
return Completable.complete();
else
return Completable.fromAction(() -> dbManager.getAlarmDAO().insert(alarm))
.andThen(saveAlarmOnServer(holster.getId(), alarm));
}
return Completable.complete();
})
.subscribe(() -> {}, Timber::e)
);
}
一切正常,现在我需要将第一个操作
sendSmsToAll(holster, alarm.type)
重复定义的时间,每次重复指定的秒数,这些设置在我的Holster
对象中定义。我尝试如下编辑
flatMap()
,使sendSmsToAll()
返回Holster
:.flatMapObservable(holster -> Observable.just(sendSmsToAll(holster, alarm.type))
.repeat(holster.sms_settings.repetitions_count)
.delaySubscription(holster.sms_settings.interval, TimeUnit.SECONDS)
)
但是SMS仅发送一次,我什至尝试了许多其他“组合”(主要是因为我是RxJava的新手),但没有任何效果。
最佳答案
您是否尝试过类似的方法:
.flatMapObservable(holster -> Observable.zip(Observable.defer(() -> sendSmsToAll(holster, alarm.type)),
Flowable.timer(holster.sms_settings.interval, SECONDS),
(x, y) -> x)
.repeat(holster.sms_settings.repetitions_count))
?