Android 如何使用RxJava获得映射函数返回的结果?
作为API调用的一部分,我正在使用RxJava的Android 如何使用RxJava获得映射函数返回的结果?,android,retrofit,rx-java,rx-android,Android,Retrofit,Rx Java,Rx Android,作为API调用的一部分,我正在使用RxJava的map函数从响应JSON创建一个图像URL列表,以获取多媒体信息列表。如何处理map函数返回的列表?这是我的代码: BrowseAPI service = CKApplication.getInstance().getRestAdapter().create(BrowseAPI.class); BrowseRequest request = new BrowseRequest("0","50","true","A"); service.getMul
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");
});
这个怎么样
Observable<Multimedia> multimediaObservable = service.getMultmedia(MyApplication.getInstance().getJSessionID(), request);
Subscription subscription = bindFragment(this, multimediaObservable
.observeOn(AndroidSchedulers.handlerThread(new Handler()))
.map(new Func1<Multimedia, ArrayList<String>>() {
@Override
public ArrayList<String> call(Multimedia multimedia) {
ArrayList<String> imageURLs = new ArrayList<String>();
for(MultiMediaImage image : multimedia.getResultsWrapper().getMultiMediaImage()) {
imageURLs.add(makeImageUrl(image);
}
return imageURLs;
}
})).subscribe(multimediaArrayList -> {
//do something with the list
});
...
private String makeImageUrl(MultiMediaImage image){
String url = "https://xxxxxxx/service/content/"
url += image.getEid();
url +="?thumbnail=true";
return url;
}
1.)是否有任何理由不使用
Func1
而只返回对象
s?2.)你到底在哪里遇到问题?你可以在你的活动
/片段
中找到一个可观察的
参考,然后在那里订阅?谢谢Mattia,我将尝试观察活动。对于Func1,我如何访问列表的值我仍然不确定我是否理解您所说的“我如何访问它们”是什么意思-您将它们作为onNext
方法的参数交给您。在您的示例中,multimedia
变量将包含Func1
的结果。无论您返回什么,call
方法被传递给onNext
。基本上,我在这里试图实现的是,getMultmedia()返回一个json响应,其中包含一个MultiMediaImage对象列表,该对象仅具有图像的ID。我正在解析getMultiMedia()响应,并使用ID创建URL的arraylist。一旦我有了URL的数组列表,我必须用authenticated header进行另一个api调用,它将返回带有实际图像URL的json响应。我必须进行两次背对背的api调用才能得到实际的图像URL。在这种情况下,查看一下flatMap
——在您的情况下,您可能需要连续使用它两次:首先将Observable
平面映射到Observable
,然后实际执行每个字符串的第二个API调用。谢谢@dioor。在您的map示例中,如果我没有错,我将不得不等到完整的imageUrls列表。我希望在创建每个对象时使用图像填充列表,而不是等到填充整个列表。我该怎么做?@r7v这要看情况而定。Observable
发出一个多媒体项,它(据我所知)有一个已经创建的图像阵列列表。因此,如果您想获取新创建的图像,您应该查看列表(getMultiMediaImage()
),而不是多媒体本身。但这是代码中更深层次的体系结构:)如果您只想一次从getMultiMediaImage()
获取一张图像,请检查上面的更新。
Observable<Multimedia> multimediaObservable = service.getMultmedia(MyApplication.getInstance().getJSessionID(), request);
Subscription subscription = bindFragment(this, multimediaObservable
.observeOn(AndroidSchedulers.handlerThread(new Handler()))
.map(new Func1<Multimedia, ArrayList<String>>() {
@Override
public ArrayList<String> call(Multimedia multimedia) {
ArrayList<String> imageURLs = new ArrayList<String>();
for(MultiMediaImage image : multimedia.getResultsWrapper().getMultiMediaImage()) {
imageURLs.add(makeImageUrl(image);
}
return imageURLs;
}
})).subscribe(multimediaArrayList -> {
//do something with the list
});
...
private String makeImageUrl(MultiMediaImage image){
String url = "https://xxxxxxx/service/content/"
url += image.getEid();
url +="?thumbnail=true";
return url;
}
.map(multimedia -> {
ArrayList<String> imageURLs = new ArrayList<String>();
for(MultiMediaImage image : multimedia.getResultsWrapper().getMultiMediaImage()) {
imageURLs.add(makeImageUrl(image);
}
return imageURLs;
})
Subscription subscription = bindFragment(this, multimediaObservable
.observeOn(AndroidSchedulers.handlerThread(new Handler()))
.flatMap(multimedia->
Observable.from(multimedia.getResultsWrapper().getMultiMediaImage())
).subscribe(multimediaImage -> {
//multimediaImage is a MultimediaImage class object
Log.i("ImageId", multimediaImage.getEid());
});