Android 如何使用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

作为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");
});
这个怎么样

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());
});