【问题标题】:RxJava2, How to combine multi observable's result?RxJava2,如何组合多个 observable 的结果?
【发布时间】:2018-12-21 13:19:26
【问题描述】:

我正在开发 Android 应用程序。 我有一个关于 RxJava2 的问题。 这是一个例子:

我有一个用户 ID 列表。 (1, 2, 3, 4, 5, ...)

val userIds = listOf(1, 2, 3, 4, 5)

我想列出用户数据。 要获取用户数据,我应该调用“REST API”。 (改造) 在这种情况下,我应该请求多个。

GET /users/1

GET /users/2

GET /users/3

GET /users/4

GET /users/5

...

fun getUsers(userIds: List<String>, callback: UsersLoadedCallback) {
    var userList = List<User>()

    val userObservables = mutableListOf<Observable<User>>()
    userIds.forEach {
        userObservables.add(UserService.getUser(it))
    }

    Observable.merge(userObservables)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                userList.add(it)
            }
}

我知道这是错误的。 但我不知道如何解决这个问题。 “加入”、“合并”、“压缩”? 我该怎么办?

【问题讨论】:

  • 创建getUser() observables 列表并使用Observable.fromIterable() 和.forEach() 构造来读出每个订阅

标签: android kotlin rx-java retrofit rx-java2


【解决方案1】:

使用fromIterable 和concatMap:

Observable.fromIterable(userIds)
    .concatMap(userId -> 
        UserService.getUser(userId).subscribeOn(Schedulers.io())
    )
    .toList()
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(users -> callback.onUsersLoaded(users), error -> { /* report */ });

【讨论】:

  • 这是要走的路
  • 第 2 行:concatMap(userId
  • 再次检查:userIds: List&lt;String&gt; 并通过fromIterable 流式传输。 userId 不能是List!
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多