比如说,我有一个类:
public class NI {
private int id;
@SerializedName("date")
private String created_at;
private String slug;
private String type;
private String link;
private WPTitle title;
private WPContent content;
private WPExcerpt excerpt;
@SerializedName("author")
private int authorId;
private int featured_media;
private WPMedia media;
List<Integer> categories;
}
和另一个类:
public class WPMedia {
private int id;
private String media_type;
private String mime_type;
private String source_url;
}
问题是WPMedia
将需要基于int featured_media
值的单独API调用。我如何建立一个可观察的链,使其获得NI
类,然后另一个获得WPMedia
,然后将其设置在对象上?
我使用Retrofit使API调用像这样:
@GET("wp-json/wp/v2/posts")
Observable<ArrayList<NI>>getPostsObservableByCategory(@Query("categories") int category, @Query ("per_page") int limit, @Query("page") int skip);
@GET("wp-json/wp/v2/media/{id}")
Observable<WPMedia> getMediaObservable(@Path("id") int id);
我还不完全清楚你到底想要什么,但我会试试的。
我首先做的一个假设是,在NI
上你有一个签名为public void setWPMedia(WPMedia media)
的setter。鉴于您给出的两个Retrofit函数定义,我建议您执行以下操作:
getPostsObservableByCategory(...)
.flatMap(nis -> getMediaObservable(...)
.first()
.doOnNext(m -> nis.foreach(ni -> ni.setWPMedia(m)))
.map(m -> nis));
逐行浏览:
-
getPostsObservableByCategory(...)
给出一个Observable
,它发出NI
实例的列表。这些列表中每个NI
上的media
字段可能已经设置,也可能没有设置。 -
getMediaObservable(...)
获取需要在上设置相应列表中每个元素的WPMedia
实例。 - 我将
getMediaObservable
的排放量限制为1,否则NI
中的字段将被设置多次,我认为这是不可取的。如果getMediaObservable(...)
函数/实现已经保证了这一点,可以省略这一行。 - 设置字段被认为是一个副作用,所以我们在这里需要
doOnNext
,其中我们循环NI
实例列表并将WPMedia
字段设置为从getMediaObservable
获得的字段。 - 我假设你想有
NI
实例的列表之后,所以我添加了一个map
,只是取代m
与该列表。
希望这对你有所帮助!
我给你找了一个演示!!我认为你可以这样做:
@GET("/token")
public Observable<String> getToken();
@GET("/user")
public Observable<User> getUser(@Query("token") String token, @Query("userId") String userId);
...
getToken()
.flatMap(new Func1<String, Observable<User>>() {
@Override
public Observable<User> onNext(String token) {
return getUser(token, userId);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<User>() {
@Override
public void onNext(User user) {
userView.setUser(user);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable error) {
// Error handling
...
}
});
博客链接