【问题标题】:Merging and filtering results (RX_observables) from independent source合并和过滤来自独立来源的结果(RX_observables)
【发布时间】:2018-11-05 09:15:17
【问题描述】:

大家好,大家好!

我有两个独立的 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 ServiceItune

String API_ITUNE_BASE_FULL_URL = "https://itunes.apple.com/search";
        @GET
        Observable<RootiTune> getItuneArtistNameRx2NoList(
                @Url String url,
                @Query("term") String artisName);

public interface ServiceLastFm

String 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 模型

@AutoValue
public abstract class  RootiTune {

    public static TypeAdapter<RootiTune> typeAdapter(Gson gson){
        return new AutoValue_RootiTune.GsonTypeAdapter(gson);
    }
    @Nullable
    @SerializedName("resultCount")
    public abstract Integer getListSize();

    @Nullable
    @SerializedName("results")
    public abstract List<ResultiTune> getListSongs();

    @Nullable
    @SerializedName("errorMessage")
    public abstract String getErrorMessage();

}

LastFM 模型

public class RootLastFm {
    @Expose
    private Results results;
    public List<ArtistLastFm> getListOfLastFm;
    public Results getResults() {
        return results;
    }
    public void setResults(Results results) {
        this.results = results;
    }
}

【问题讨论】:

    标签: java android retrofit2 rx-java2 android-mvvm


    【解决方案1】:

    如果您没有RootiTuneRootLastFm 的基本接口,可以使用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
            });
    

    【讨论】:

    • 因篇幅问题,我在帖子中回复了
    • @htw,没有找到额外的信息。你能解释一下有什么问题吗?
    【解决方案2】:

    你可以这样做,

    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
    

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2018-06-14
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多