如何进行并行或连接的API调用?

时间:2017-12-14 15:30:47

标签: java android concurrency retrofit2 gson

我正在构建一个Android应用程序(实际上是我的第一个应用程序),它是关于获取与您搜索的类似的跟踪。我正在使用rofJava和gson的retrofit2进行调用。 对于每个轨道,我发现我在图像视图中添加了响应提供的相应图像,但是这个图像不是实际的相册图像,它只是乐队的图像。我想拥有专辑图片,如果我进行专辑搜索,我可以从API获得。

那么有没有办法进行API调用,返回每个曲目的专辑信息,而不会浪费很多时间加载?我希望这些调用彼此并行发生,以便“用户”(我)不那么明显。

这是我用来搜索类似曲目的代码:

private void loadSimilarTracks() {
    String mbid = selectedTrack.getMbid();
    String artist = selectedTrack.getmArtist();
    String track = selectedTrack.getName();

    searchService = new LastFMSearchService();

    Flowable<List<TrackSimilar>> fetchDataObservable = null;
    if(!mbid.equals("")) {
        fetchDataObservable = searchService.getSimilarTracks(mbid);
    }
    else{
        fetchDataObservable = searchService.getSimilarTracks(artist, track);
    }


    mCompositeSubscription.add(fetchDataObservable
            .timeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableSubscriber<List<TrackSimilar>>() {

                @Override
                public void onNext(List<TrackSimilar> tracks) {

                    mTracks = tracks;
                    similarTrackAdapter.setTrackList(tracks);
                }

                @Override
                public void onError(Throwable e) {

                    Toast.makeText(getActivity(), "API CALL ERROR", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onComplete() {
                    resultsView.setVisibility(View.VISIBLE);
                }
            })
    );
}

P.S我正在使用lastFM api获取我的信息。 提前感谢您的回复。

1 个答案:

答案 0 :(得分:0)

您的代码很好,您可以做的一件事是您可以将代码分成多个函数而不是单个函数,并将它们作为单独的线程运行。

一个函数使api调用搜索类似的轨道和其他来获取图像并信任我,这显着改善了响应。希望它有所帮助..