我想要做的是点击端点以获取用户列表,返回Single<List<User>>
。接下来,我想获取前三个用户并点击另一个端点以获取他们的所有帖子Single<List<Post>>
。最后,我想显示一个Toast
,其中包含所有前3位用户的帖子总数。
我已经能够使用Kotlin中提供的flatten()
功能实现它。但是,我想知道如何仅使用RxJava 2来做到这一点。有可能吗?感谢。
...
getPostsForFirstThreeUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ posts -> toast("There are: ${posts.flatten().size} posts") },
{ ex -> Timber.e(ex, "there was an error processing the request") }
)
fun getFirstThreeUsers(): Flowable<User> {
return getAllUsers()
.flattenAsFlowable { users -> users }
.doOnNext { Timber.i("a user: ${it.username}") }
.take(3)
}
fun getPostsForFirstThreeUsers(): Single<List<List<Post>>> {
return getFirstThreeUsers()
.flatMapSingle { api.getUsersPosts(it.id) }
.doOnNext { Timber.i("number of posts: ${it.size}") }
.toList()
}
答案 0 :(得分:3)
由于您只查找帖子总数,因此您可以flatmap
列表中的count
,然后getPostsForFirstThreeUsers()
.subscribeOn(Schedulers.io())
.flatmapObservable(Observable::fromIterable)
.flatmap(Observable::fromIterable)
.count()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ count -> toast("There are: ${count} posts") },
{ ex -> Timber.e(ex, "there was an error processing the request") }
)
。平面映射不保证顺序,而是将列表列表展平为单个流。
ViewGroup parentGroup = (ViewGroup) requestsListView.getParent();
View empty = getActivity().getLayoutInflater().inflate(R.layout.empty_view,
parentGroup,
false);
parentGroup.addView(empty);
requestsListView.setEmptyView(empty);
答案 1 :(得分:2)
我没有对此进行过测试,但我认为您可以使用flatmap
和reduce
(或collect
)进行测试。可能是这样的:
getAllUsers()
.take(3)
.flatMap { api.getUsersPosts(it.id) }
.map { it.size }
.reduce(0) { acc, e -> acc + e }
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ posts -> toast("There are: ${posts.flatten().size} posts") },
{ ex -> Timber.e(ex, "there was an error processing the request") }
)
答案 2 :(得分:1)
我最终使用此解决方案,这使我可以访问整个List
个Post
个对象。谢谢你的指导。
fun getPostsForFirstThreeUsers(): Single<MutableList<Post>> {
return getFirstThreeUsers()
.flatMapSingle { api.getUsersPosts(it.id) }
.doOnNext { Timber.i("number of posts: ${it.size}") }
.flatMapIterable { it }
.doOnNext { Timber.i("the post: $it") }
.toList()
}