我试图用RxJava + Retrofit + Kotlin学习连锁请求。 我接下来的教程是使用RxJava 1.x,所以当我尝试使用RxJava 2.x重新实现时,我无法使 .zip()工作。
这是一个使用星球大战API的简单应用,返回电影列表,每部电影都有ando,从中获取角色。
fun loadMoviesFull(): Observable<Movie> {
return service.listMovies()
.flatMap { filmResults -> Observable.from(filmResults.results) }
.flatMap { film ->
Observable.zip(
Observable.just(Movie(film.title, film.episodeId, ArrayList<Character>())),
Observable.from(film.personUrls)
.flatMap { personUrl ->
service.loadPerson(Uri.parse(personUrl).lastPathSegment)
}
.map { person ->
Character(person!!.name, person.gender)
}
.toList(),
{ movie, characters ->
movie.characters.addAll(characters)
movie
})
}
}
如果你想看到教程的整个实现,这就是链接(评论是葡萄牙语): http://www.nglauber.com.br/2017/03/rxjava-kotlin-retrofit-star-wars-api.html
我只想知道ir的语法,因为我无法在2.x上实现。
非常感谢你,我很抱歉我的英语不好。
答案 0 :(得分:0)
我不知道编译器会产生什么错误但很可能你的函数应该返回Observable<List<Movie>>
,zip
的{{1}}需要明确传递类型而不应该有BiFunction
} 在末尾。当然最后是movie
。
完整代码:
.toList()
答案 1 :(得分:0)
由于声誉不足,它不会让我添加评论,因此张贴作为答案。你在使用rxkotlin吗?有许多辅助函数,包括Observable.zip()
,可以帮助解决使用Rx2时的SAM模糊问题。不知道你的错误是什么,这是我能给出的最佳建议。