Android 将带条件的循环转换为RxJava流

Android 将带条件的循环转换为RxJava流,android,rx-java,rx-java2,rx-kotlin,rx-kotlin2,Android,Rx Java,Rx Java2,Rx Kotlin,Rx Kotlin2,我有代码在while循环中执行阻塞操作(从服务器下载一些数据)。客户不知道在每个步骤中要返回多少项。下载N个项目时循环中断 val n = 10 val list = ArrayList<T>() while (list.size < n) { val lastItemId = list.last()?.id ?: 0 val items = downloadItems(lastItemId) list.addAll(items) } val n=1

我有代码在while循环中执行阻塞操作(从服务器下载一些数据)。客户不知道在每个步骤中要返回多少项。下载N个项目时循环中断

val n = 10
val list = ArrayList<T>()

while (list.size < n) {
    val lastItemId = list.last()?.id ?: 0
    val items = downloadItems(lastItemId)
    list.addAll(items)
}
val n=10
val list=ArrayList()
while(list.size

downloadItems
执行阻止HTTP调用并返回列表。现在,让我们假设
下载项目
发生了变化,新的返回类型是
可观察的
。如何在不执行类似于
blockingGet
的操作的情况下将代码更改为使用RxJava?

您可以使用
repeatUntil
来实现这一点:

var totalItems = 0    
var id = 0
Observable.fromCallable {
            downloadItems(id)
        }
        .flatMap {
            list ->
                totalItems += list.size
                id = list.last()?.id ?: 0
                Observable.just(list)
        }
        .repeatUntil({totalItems > n})
        .subscribe({result -> System.out.println(result) })

我认为这是一种优雅的方式

int n = 10;
Observable.range(0,n)
        .flatMap(i -> downloadItems(i))
        .toList()
        .subscribe(itemsList -> itemsList.forEach(item -> System.out.println(item)));

这将调用downLoadItems 10次。我只想下载10个项目。每次调用downloadItems都可能返回0多个项目,项目的确切数量未知。我发现的问题与您的问题类似