0

大家好,大家好!

我有两个独立的 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;
    }
}
4

2 回答 2

0

如果您没有 和 的基本界面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
        });
于 2018-11-05T10:08:07.643 回答
0

你可以做这样的事情,

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
于 2018-11-07T07:35:28.117 回答