Android 获取RxJava的前10项
我使用RxJava从JSONplaceholder api获取帖子列表 我只想从列表中选取前10名并保存在数据库中 我知道我需要使用take运算符,但无法确定如何使用concatMap 这是我已经有的东西Android 获取RxJava的前10项,android,kotlin,rx-java,rx-android,flatmap,Android,Kotlin,Rx Java,Rx Android,Flatmap,我使用RxJava从JSONplaceholder api获取帖子列表 我只想从列表中选取前10名并保存在数据库中 我知道我需要使用take运算符,但无法确定如何使用concatMap 这是我已经有的东西 private fun loadPosts(){ subscription = Observable.fromCallable { postDao.all } .concatMap { dbPostList ->
private fun loadPosts(){
subscription = Observable.fromCallable { postDao.all }
.concatMap { dbPostList ->
postApi.getPosts().concatMap { apiPostList ->
//HERE i ONLY WANT TO TAKE 10 ITEMS AND SAVE IT (HOW CAN I USE TAKE OPERATOR HERE)
postDao.insertAll(*apiPostList.toTypedArray())
Observable.just(apiPostList)
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { onRetrievePostListStart() }
.doOnTerminate { onRetrievePostListFinish() }
.subscribe(
{ result -> onRetrievePostListSuccess(result) },
{ onRetrievePostListError() }
)
}
下面是我尝试过的代码,但它没有按预期工作
postApi.getPosts()
.take(10) // DOES NOT WORK
.concatMap { apiPostList ->
postDao.insertAll(*apiPostList.toTypedArray())
Observable.just(apiPostList)
}
getPosts()
返回一个列表。要使用take(10)
,您必须单独发出列表中的每个元素。但是,由于您一次就发出了整个列表,这就好像take(10)
正在尝试获取10个帖子列表,而不是10个帖子
我可以想出两种方法来解决这个问题。您可以将列表转换为可观察列表,如下所示:
postApi.getPosts()
.flatMap { Observable.fromIterable(it) }
.take(10)
.toList()
发出列表中的每一项,取出其中的10项,并将结果收集到一个列表中,为您的concatMap
做好准备
另一个选项是手动对列表进行切片:
postApi.getPosts()
.map { it.slice(0 until 10) }
虽然不是这样,但仍然应该有效
小心点,因为这两种方法都假设列表中至少有10项。我认为takewhile操作符只是为了这个Hello@Fred而创建的,找不到flatMapObservable。你能相应地修改我的代码吗。我对rxjava还很陌生,很抱歉,因为某种原因,我以为
getPosts
返回了一个。在这种情况下,你可以只使用flatMap
你能给出一个例子吗,请告诉我如何使用flatMap和take这正是我发布的内容吗。必需:((列表)→ 出版商!)!发现:(列表)→ 看得见!