用RX和Kotlin编写网络请求

我正在使用与RXJava和Retrofit进行网络调用的kotlin的Android应用程序。 在启动时,应用程序将对类似REST的后端执行多个网络调用。 该程序看起来非常像Netflix在其示例中使用的程序。 然而,当试图重写它与Kotlin一起工作时,我正在挣扎。 我很难理解Kotlin关闭中的回报如何工作。 非常感谢这里的一些帮助!

Netflix的例子:

return getUser(userId).flatMap(user -> { Observable<Map<String, Object>> catalog = getPersonalizedCatalog(user) .flatMap(catalogList -> catalogList.videos().<Map<String, Object>> flatMap( video -> { Observable<Bookmark> bookmark = getBookmark(video); Observable<Rating> rating = getRatings(video); Observable<VideoMetadata> metadata = getVideoMetadata(video); return Observable.zip(bookmark, rating, metadata, (b, r, m) -> combineVideoData(video, b, r, m)); })); Observable<Map<String, Object>> social = getSocial(user).map(s -> { return s.getDataAsMap(); }); return Observable.merge(catalog, social); }).flatMap(data -> { String json = SimpleJson.mapToJson(data); return response.writeStringAndFlush("data: " + json + "\n"); }); 

我的解决方案

 restClient.getVideoList("VAR1", "VAR2") .subscribeOn(Schedulers.io()) .flatMap { videos -> Observable.from(videos)} .map { video -> var actors: Observable<List<Actor>> = restClient.getActorList(video.id(), "VAR2") var price = restClient.getPrice(video.id(), "VAR2") Observable.zip(actors, price, { (a, p) -> combineVideoData(video, a, p)}) }.map{ video -> doSomethingWithVideo(video) } 

出于某种原因,我的实现返回一个可观察的而不是它应该的视频对象。 毫无疑问,我对科特林关闭的理解出了问题,我试图想出来好几天,但仍然在挣扎。 将非常感激任何帮助!

你已经创建了observable,但没有订阅它。 您应该使用forEach {} (来自RxKotlin)或subscribe {}而不是最后一张map 。 看起来像

 restClient.getVideoList("VAR1", "VAR2") .subscribeOn(Schedulers.io()) .flatMap { videos -> Observable.from(videos)} .map { video -> var actors: Observable<List<Actor>> = restClient.getActorList(video.id(), "VAR2") var price = restClient.getPrice(video.id(), "VAR2") Observable.zip(actors, price, { (a, p) -> combineVideoData(video, a, p)}) }.forEach { video -> doSomethingWithVideo(video) } 

当你操纵一个observable时,你会得到一个新的observable。

如果你想从你的可观察值中获得你的价值,你必须通过阻止它来退出它(“退出monad”):

 val value = yourObs.toBlocking().first()