android - 为什么 RxJava 中的 take(5) 运算符返回所有对象

标签 android rx-java rx-java2

我对 rxjava 中的 take(5) 运算符有疑问。我不明白为什么 subscribe {ui.showLikes(it)} 始终返回数据库中的所有对象。运算符 take() 不起作用?我做错了什么?感谢您的帮助。

fun downloadLikes(userId: String, skillId: Int) {
    val subscription = apiService.rxListPluses()
            .flatMap {
                localDataSource.savePluses(it)
                apiService.getUserDetails()
            }
            .flatMap {
                localDataSource.rxGetLikeItems(userId, skillId)
                        .take(5)
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                ui.showLikes(it)
            }

    bindToLifecycle(subscription)
}

public Observable<ArrayList<LikeItem>> rxGetLikeItems(String userId, int skillId) {
    return Observable.fromCallable(() -> getLikeItems(userId, skillId));
}

最佳答案

在评论中点赞,rxGetLikeItems发出 ArrayList<LikeItem> , 不是 LikeItem .

所以 rxGetLikeItems(your, mum).take(5)意思是“取前五个 List<LikeItem> 发出”

为了更清楚地使用另一个示例,假设函数:

fun getList() : Observable<List<Int>> {
    return Observable.just(listOf(1,2,3,4,5,6,7,8,9,10))
}

如果我们调用 take(5)对此:

getList()
        .take(5)
        .test()
        .assertResult(
            listOf(1,2,3,4,5,6,7,8,9,10)
)

我们得到第一个列表作为发射。

您可能想要的是类似 flatMapIterable 的东西:

getList()
        .flatMapIterable { x -> x }
        .take(5)
        .test()
        .assertResult(
                1,2,3,4,5
        )

或者如果您需要发出一个列表:

getList()
        .flatMapIterable { x -> x }
        .take(5)
        .toList()
        .test()
        .assertResult(
               listOf(1,2,3,4,5)
        )

另请注意,最好返回 List而不是 ArrayList如果可能的话,因为 Liskov 替换原则。

关于android - 为什么 RxJava 中的 take(5) 运算符返回所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51197994/

相关文章:

kotlin - 如何使用 RxJava 2 将单个<List<List<T>>> 合并到 List<T> 中?

rx-java2 - 取消订阅 RxJava2/RxAndroid PublishSubject

android - 使用 RxJava2 和 MutableLiveData 进行单元测试

安卓:自适应阈值

android - 订阅多个 Observable 的适配器

java - 寻找 Rxjava 运算符将源合并到一个流中

android - 函数不在后台线程上执行

android - RemoteInput 上的 AllowedDataType 是什么?

Android CookieManager setCookie 没有设置任何东西

android - 从 Android 菜单项图标获取可绘制对象