【发布时间】:2015-07-19 16:28:48
【问题描述】:
作为我的 API 调用的一部分,我使用 RxJava 的 map 函数从响应 JSON 中创建图像 URL 列表来获取多媒体信息列表。如何处理从 map 函数返回的列表?这是我的代码:
BrowseAPI service = CKApplication.getInstance().getRestAdapter().create(BrowseAPI.class);
BrowseRequest request = new BrowseRequest("0","50","true","A");
service.getMultmedia(MyApplication.getInstance().getJSessionID(), request).map(new Func1<Multimedia, Object>() {
@Override
public Object call(Multimedia multimedia) {
ArrayList<String> imageURLs = new ArrayList<String>();
for(MultiMediaImage image : multimedia.getResultsWrapper().getMultiMediaImage()) {
String url = "https://xxxxxxx/service/content/imageByEntitlement/";
url += image.getEid();
url +="?thumbnail=true";
imageURLs.add(url);
}
return imageURLs;
}
}).subscribe(multimedia -> {
Log.d("dfa", "adga");
});
我能够从响应中创建 URL 的字符串列表,我想在单独的活动或片段中处理这个 URL 列表。
使用flatMap,我相信这可以改进:
BrowseAPI service = CKApplication.getInstance().getRestAdapter().create(BrowseAPI.class);
BrowseRequest request = new BrowseRequest("0","50","true","A");
service.getMultmedia(CKApplication.getInstance().getJSessionID(), request).flatMap(new Func1<Multimedia, Observable<MultiMediaImage>>() {
@Override
public Observable<MultiMediaImage> call(Multimedia multimedia) {
Observable<MultiMediaImage> observable = Observable.from(multimedia.getResultsWrapper().getMultiMediaImage());
return observable;
}
}).subscribe(new Action1<MultiMediaImage>() {
@Override
public void call(MultiMediaImage multiMediaImage) {
service.getImageObject(CKApplication.getInstance().getJSessionID(), multiMediaImage.getEid()).observeOn(AndroidSchedulers.mainThread()).subscribe(imageObject -> {
mImages.add(imageObject.getAuthenticatedStoreUrl());
adapter.notifyDataSetChanged();
});
}
});
【问题讨论】:
-
1.) 你有什么理由不使用
Func1<Multimedia, List<String>>而只是返回Objects? 2.) 你到底在哪里遇到问题?您可以在Activity/Fragment中获得对Observable的引用并在那里订阅? -
谢谢 Mattia ,我会尝试观察活动。如果是 Func1
> ,我如何访问 List 的值 -
我仍然不确定我是否理解您所说的“我如何访问它们”的意思——您将它们作为您的
onNext方法的参数交给您。在您的示例中,multimedia变量将包含您的Func1的结果。不管你return,call方法都会传递给onNext。 -
基本上,我在这里想要实现的是,getMultmedia() 返回一个带有 MultiMediaImage 对象列表的 json 响应,其中只有图像的 ID。我正在解析 getMultiMedia() 响应并使用 ID 创建 URL 的数组列表。一旦我有了 URL 的数组列表,我必须使用经过身份验证的标头进行另一个 api 调用,这将返回带有实际图像 URL 的 json 响应。我必须进行两次背靠背 api 调用才能获取实际的图像 URL。
-
在这种情况下,请查看
flatMap- 在您的情况下,您可能希望连续使用它两次:首先将Observable<List<String>>平面映射到Observable<String>,然后实际执行您对每个Strings 的第二次 API 调用。
标签: android retrofit rx-java rx-android