4

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)
}

downloadItemsブロッキング HTTP 呼び出しを実行し、リストを返します。downloadItemsここで、変更と新しい戻り値の型が であると仮定しましょうObservable<Item>。のようなことを実行せずに RxJava を使用するようにコードを変更するにはどうすればよいblockingGetですか?

4

2 に答える 2

10

これを達成するために使用できます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) })
于 2018-07-05T08:21:45.353 に答える