Как сделать 4 разных звонка на 4 разные конечные точки в одном действии в android и передать накопленный результат адаптеру - PullRequest
0 голосов
/ 02 февраля 2020

Я занимаюсь разработкой приложения android, в котором я хочу сделать 4 разных вызова API для разных конечных точек tmdbapi. Я использую модификацию и java. Как я могу объединить эти вызовы в пределах одного фрагмента, дождаться их окончания sh и передать все результаты каждого отдельного вызова в класс адаптера для привязки представления.

Вот мой модифицированный класс клиента tmdbapi.

package com.popularmovies.Model;




import retrofit2.Call;

import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface TMDBAPICLIENT {
    final String BASE_URL = "https://api.themoviedb.org/3/";

    @GET("discover/movie")
    Call<DISCOVERPOJO> getDiscover(@Query("sort_by") String sort_by, @Query("api_key") String api_key);

    @GET("trending/{media_type}/{time_window}")
    Call<TRENDINGPOJO> getTrending(@Path("media_type") String media_type, @Path("time_window") String time_window, @Query("api_key") String api_key);

    @GET("person/popular")
    Call<DISCOVERPOJO> getPeople(@Query("api_key") String api_key);

    @GET("tv/top_rated")
    Call<DISCOVERPOJO> getTopRatedTv(@Query("api_key") String api_key);

    @GET("tv/popular")
    Call<DISCOVERPOJO> getPopularTv(@Query("api_key") String api_key);

    @GET("tv/on_the_air")
    Call<DISCOVERPOJO> getOnAirTv(@Query("api_key") String api_key);

    @GET("tv/airing_today")
    Call<DISCOVERPOJO> getAiringTodayTv(@Query("api_key") String api_key);

}

звонки, которые меня интересуют в этом контексте, - это дно 4. Я тоже новичок ie в этом. Вздох.

1 Ответ

1 голос
/ 02 февраля 2020

Вы можете использовать RX Java для этого наверняка.

выполните следующие изменения.

1) добавьте зависимости, обновите их до последней, если это возможно

implementation 'com.android.support:cardview-v7:27.1.0'
implementation 'com.android.support:design:27.1.0'
implementation('com.squareup.retrofit2:retrofit:2.3.0')
        {
            exclude module: 'okhttp'
        }

implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'io.reactivex.rxjava2:rxjava:2.1.9'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

2) В свой вызов по модернизации сети добавьте RxJavaCallAdapterFactory

  Retrofit retrofit = new Retrofit.Builder()
  .baseUrl("https://api.github.com/")
  .addConverterFactory(GsonConverterFactory.create())
  .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
  .build();

3) измените ваши существующие вызовы на что-то вроде ниже

public interface TMDBAPICLIENT {
    final String BASE_URL = "https://api.themoviedb.org/3/";

    @GET("discover/movie")
    Observable<DISCOVERPOJO> getDiscover(@Query("sort_by") String sort_by, @Query("api_key") String api_key);

    @GET("trending/{media_type}/{time_window}")
    Observable<TRENDINGPOJO> getTrending(@Path("media_type") String media_type, @Path("time_window") String time_window, @Query("api_key") String api_key);

    @GET("person/popular")
    Observable<DISCOVERPOJO> getPeople(@Query("api_key") String api_key);

    @GET("tv/top_rated")
    Observable<DISCOVERPOJO> getTopRatedTv(@Query("api_key") String api_key);

    @GET("tv/popular")
    Observable<DISCOVERPOJO> getPopularTv(@Query("api_key") String api_key);

    @GET("tv/on_the_air")
    Observable<DISCOVERPOJO> getOnAirTv(@Query("api_key") String api_key);

    @GET("tv/airing_today")
    Observable<DISCOVERPOJO> getAiringTodayTv(@Query("api_key") String api_key);

}

4) Используйте оператор слияния zip для zip они вместе.

Observable.zip(getDiscover("desc","SECRET_KEY"), getPeople("asc","SECRET_KEY"), new Func2<DISCOVERPOJO, DISCOVERPOJO, ArrayList<TestData>>() {
            @Override
                public ArrayList<TestData> call(DISCOVERPOJO responseOne, DISCOVERPOJO responseTwo) {
                  ArrayList<TestData> testDataList = new ArrayList();
                      // process data from response responseOne & responseTwo
                  return testDataList;
            } 
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber<ArrayList<TestData>>() {

        @Override
        public void onNext(ArrayList<TestData> testDataList) {
           //do something with new data
        }

        @Override
        public void onCompleted() {
            Log.d(TAG, "onCompleted" ); 
            // you can show alert here or do something when completed 
        }

        @Override
        public void onError(Throwable t) {
            Log.d(TAG, "onError Throwable: " + t.toString() );
        }
    });

где ArrayList<TestData> - данные, которые мы хотим вернуть из оператора zip. Вы можете изменить это на то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...