Rxjava while循环获取数据库对象并上传到服务器

时间:2019-07-04 00:42:44

标签: android rx-java rx-java2

我对如何在RxJava中实现这一点感到困惑。 我想

  1. 从我的数据库中获取一个对象
  2. 上传
  3. 从数据库中删除它
  4. 从数据库中获取下一项,然后重复2和3
  5. 当数据库中没有剩余对象时完成

我知道如何通过首先从数据库中加载所有对象并创建一个Observable这样的Observable.fromIterable(allMyDbObjects)来做到这一点,但是如果数据库的话,我想一次获取一个对象我上载时已更新。 我不知道该怎么做。我看过repeatUntil,但它似乎可以立即重复。这是我在想的伪代码:

getFirstDbObject()
    .flatMapCompletable { obj ->
        upload(obj)
            .doOnComplete {
                 deleteFromDb(obj)
            }
    }
    .repeatUntil {
        // dbIsEmptyLogic. 
        // This doesn't work. I need to somehow call getFirstDbObject() again
    }

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

这是我代码库中的可行解决方案。

    val source = HashSet<String>()
    source.add("a")
    source.add("b")
    source.add("c")
    source.add("d")
    source.add("e")
    io.reactivex.Observable.just(Unit)
        .flatMap { it ->
            io.reactivex.Observable.fromCallable {
                println("first flatmap print $it")
                // uploadObj()
                source.first()
            }
        }.flatMap {
            // delete
            io.reactivex.Observable.fromCallable {
                source.remove(it)
                println("second flatmap remove $it")
                // delete object
            }
        }
        .repeatUntil { source.isEmpty() }
        .subscribe()

答案 1 :(得分:1)

假设getFirstDbObject()返回Maybe,可以通过将结果映射到布尔值(如果数据库为空,则为true,如果不是,则为false),然后重复该序列直到getFirstDbObject()返回空,流完成。

getFirstDbObject()
    .toObservable()
    .flatMapSingle { obj ->
        upload(obj)
            .doOnComplete { deleteFromDb(obj) } // probably better to use .andThen(deleteFromDb(obj)) if delete also returns a completable
            .toSingleDefault(false)
    }
    .defaultIfEmpty(true)
    .repeat()
    .takeUntil { isComplete ->
        isComplete
    }