为了账号安全,请及时绑定邮箱和手机立即绑定

合并和过滤来自独立来源的结果 (RX_observables)

合并和过滤来自独立来源的结果 (RX_observables)

眼眸繁星 2021-12-30 17:23:25
大家好,大家好!我有两个独立的 api(lastFM 和 iTune)源。代码单独为 ich 工作,我可以搜索(过滤)我想要的艺术家。现在我想结合结果,使用这种 RXJava 方法并在 RecyclerView 中显示它们。我正在阅读Observable.zip或简单的合并(顺序并不重要),但我在这个问题上坚持得太久了,我不知道如何开始..我应该为组合创建下一个模型,例如:public class iTuneAndLastFM {    public JsonArray iTuneObject;    public JsonArray LastFmObject;    public iTuneAndLastFM(JsonArray iTuneObject, JsonArray lastFmObject) {        this.iTuneObject = iTuneObject;        LastFmObject = lastFmObject;    }}或者没有必要?我被困在这里,我无法移动..所以请帮忙!我目前的工作(情况):public interface ServiceItuneString API_ITUNE_BASE_FULL_URL = "https://itunes.apple.com/search";        @GET        Observable<RootiTune> getItuneArtistNameRx2NoList(                @Url String url,                @Query("term") String artisName);public interface ServiceLastFmString API_LAST_FM_FULL_URL = "http://ws.audioscrobbler.com/2.0/?method=artist.search&format=json";    Observable<RootLastFm> searchArtistRx(            @Url String url,            @Query("artist") String artistName,            @Query("api_key") String key    );我的视图模型:public void getLastFmRx(String query) {    disposables.add(serviceLastFm.searchArtistRx(ServiceLastFm.API_LAST_FM_FULL_URL, query,ServiceLastFm.KEY_LAST_FM)            .subscribeOn(Schedulers.io())            .observeOn(AndroidSchedulers.mainThread())            .subscribe(rootLastFmList -> responseLiveData.setValue(rootLastFmList))            );};public  void getItubnRxTest2 (String query){    disposables.add(serviceItune.getItuneArtistNameRx2NoList(ServiceItune.API_ITUNE_BASE_FULL_URL,query)            .subscribeOn(Schedulers.io())            .observeOn(AndroidSchedulers.mainThread())            .subscribe(rootiTuneList->responsItuneeLiveData.setValue(rootiTuneList) )    );};最后,我的 iTunes 模型:@AutoValuepublic abstract class  RootiTune {    public static TypeAdapter<RootiTune> typeAdapter(Gson gson){        return new AutoValue_RootiTune.GsonTypeAdapter(gson);    }    @Nullable    @SerializedName("resultCount")    public abstract Integer getListSize();}
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

你可以做这样的事情,


Observable<RootiTune> ituneObservable = serviceItune

        .getItuneArtistNameRx2NoList(ServiceItune.API_ITUNE_BASE_FULL_URL, query);

Observable<RootLastFm> lastFmObservable = serviceLastFm

        .searchArtistRx(ServiceLastFm.API_LAST_FM_FULL_URL, query, ServiceLastFm.KEY_LAST_FM);

Observable

    .zip(

        ituneObservable,

        lastFmObservable,

        (BiFunction<RootiTune, RootLastFm, Pair<RootiTune, RootLastFm>>) (ituneResult, lastFmResult) -> Pair

             .create(ituneResult, lastFmResult)

        )

        .toList()

        .subscribeOn(Schedulers.io())

        .observeOn(AndroidSchedulers.mainThread())

        .subscribe(

            list -> listOfPair,

            error -> {

                // TODO handle error

            }

        );

获得 Pair 列表后,遍历列表并执行


pair.first to get RootiTune

pair.second to get RootLastFm


查看完整回答
反对 回复 2021-12-30
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

如果你不具备基本的接口RootiTune和RootLastFm,你可以使用Observable#zip()。首先,为两个结果创建包装器:


class ResultWrapper(RootiTune ituneResult, RootLastFm lastFmResult) {

    public final RootiTune ituneResult;

    public final RootLastFm lastFmResult;


    public ResultWrapper(RootiTune ituneResult, RootLastFm lastFmResult) {

        this.ituneResult = ituneResult;

        this.lastFmResult = lastFmResult;

    }

}

之后,您可以压缩源:


Observable<RootiTune> ituneObservable = serviceItune.getItuneArtistNameRx2NoList(ServiceItune.API_ITUNE_BASE_FULL_URL,query);

Observable<RootLastFm> lastFmObservable = serviceLastFm.searchArtistRx(ServiceLastFm.API_LAST_FM_FULL_URL, query,ServiceLastFm.KEY_LAST_FM);

Observable.zip(ituneObservable, lastFmObservable, (ituneResult, lastFmResult) -> new ResultWrapper(ituneResult, lastFmResult))

    .subscribeOn(Schedulers.io())

    .observeOn(AndroidSchedulers.mainThread())

    .subscribe(resultWrapper -> {

            responseFmLiveData.setValue(resultWrapper.lastFmResult);

            responsItuneeLiveData.setValue(resultWrapper.ituneResult);

        }, 

        error -> {

            // TODO handle error

        });


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号