我有一个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))


07-27 15:09