【发布时间】:2016-02-24 17:47:56
【问题描述】:
我正在尝试使用 StackOverFlow API。我想要带有名称、计数和描述的标签列表。问题是描述在不同的api函数中返回:
https://api.stackexchange.com/2.2/tags?page=1&pagesize=3&order=desc&sort=popular&site=stackoverflow
只给了我三个所需字段中的两个:(点击链接试试):
- 1)名称
- 2)计数
https://api.stackexchange.com/2.2/tags/javascript%3Bjava%3Bc%23/wikis?site=stackoverflow 获取标签名称并给我:
- 3)摘录(描述)
我建立了一个 Retrofit 界面:
class Item {
@SerializedName("name")
public String name;
@SerializedName("count")
public String count;
@SerializedName("excerpt")
public String excerpt;
}
class Items {
@SerializedName("items")
public Item[] items;
}
@GET("/2.2/tags")
Observable<Items> getItems(@Query("page") String page,
@Query("pagesize") String pagesize,
@Query("order") String order,
@Query("sort") String sort,
@Query("site") String site);
@GET("/2.2/tags/{tagnames}/wikis")
Observable<Items> getDescription(@Path("tagnames") String tagnames,
@Query("site") String site);
所以,首先,我们应该执行 getItems,然后获取所有名称并执行 getDescription func,最后用新字段填充我们的 Items。 所以我想收集所有 3 个(名称、计数和摘录在一个 observable 中)。
到目前为止,这是我的观察者:
App.getServerAPI()
.getItems("page", "pagesize", "order","sort", "site") //just example strings
.observeOn(AndroidSchedulers.mainThread());
我应该怎么做?我应该在这两个函数中使用 Observable 吗?
更新: 听从你的建议,我写了这么一篇:
public Observable<ServerAPI.Tags> call() {
return App.getServerAPI()
.getItems("page", "pagesize", "order", "sort", "site")
.map(new Func1<ServerAPI.Tags, ServerAPI.Tags>() {
@Override
public ServerAPI.Tags call(ServerAPI.Tags tags) {
String tagsStr = "";
for (ServerAPI.Tag tag: tags.items){
tagsStr +=tag.name+";";
}
ServerAPI.Excerts excerts = App.getServerAPI().
getExcerts(tagsStr, "site");
for (ServerAPI.Excert excertItem : excerts.items){
for (ServerAPI.Tag tagItem: tags.items){
if (excertItem.tag_name.equals(tagItem.name)){
tagItem.excerpt = excertItem.excerpt;
}
}
}
return tags;
}
})
.delay(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread());
}
看起来很丑!
【问题讨论】:
-
你必须创建一个 Observable,用 2 个 observables 制作一个 .zip,完成后你有 2 个结果,并用 2 个结果创建具有名称、计数和摘录的项目
标签: android retrofit rx-java rx-android