Выполнение нескольких асинхронных запросов с использованием Retrofit - PullRequest
0 голосов
/ 21 ноября 2019

В моем приложении для Android у меня есть экран, на котором у меня есть 3 счетчика, которые необходимо заполнить из вызова API.

static List<TripCode> tripCodeList = new ArrayList<>();
static List<Fleet> truckList = new ArrayList<>();
static List<Trailer> trailerList = new ArrayList<>();

И я не хочу раздувать макет, пока не получу ответ отвсе 3 различных вызова API, так что это то, что я делаю

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;

        if (MyApplication.isConnected()) {
            getTripCodes();
        } else {
            Toast.makeText(this, "No internet Connection", Toast.LENGTH_LONG).show();
            setContentView(R.layout.no_internet_connection);
        }
    }

По сути, я удалил setContentView(R.layout.activity_create_trip); из onCreate() И я позвонил getTripCodes()

вот код дляgetTripCodes()

   public void getTripCodes() {

        MyApplication.showProgressDialog(getString(R.string.please_wait), this);
        IMyAPI iMyAPI = MyApplication.getIMyAPI();
        Call<List<TripCode>> call = iMyAPI.getTripCodes();

        call.enqueue(new Callback<List<TripCode>>() {
            @Override
            public void onResponse(Call<List<TripCode>> call, Response<List<TripCode>> response) {

                if (response.isSuccessful() && response.body() != null) {
                    tripCodeList = response.body();
                    Log.d("test", "getTripCodes success = " + tripCodeList.size());
                    getTrucks();
                } else {
                    MyApplication.dismissProgressDialog();

                }
            }

            @Override
            public void onFailure(Call<List<TripCode>> call, Throwable t) {
                MyApplication.dismissProgressDialog();
            }
        });

    }

Таким образом, в случае успешного вызова я вызываю другую функцию getTrucks(), которая также получает результат от API, и в случае успеха она вызывает getTrailers()

Но я думаю, что это пустая трата времени, потому что я могу вызвать все три функции параллельно, а затем проверить, заполнен ли весь список или нет.

Но я не знаю, как это сделать,Как я могу проверить, все ли звонки успешны? И если один из них потерпел неудачу, как я узнаю, какой именно потерпел неудачу?

1 Ответ

0 голосов
/ 21 ноября 2019

Я полагаю, что для вашей проблемы вы можете легко использовать Retrofit 2.6.0, который имеет поддержку сопрограмм, и вы можете объявить все функции как приостановленные функции и отправить их диспетчером async/launch, и если вы хотите дождаться какого-то результата в некоторых случаяхиспользуйте await(), чтобы дождаться результата.

И используйте RxJava / liveData для отзывчивого пользовательского интерфейса

, пример кода для вас будет выглядеть как

//maybe from Activity for ViewModel you can use ViewModelScope
GlobalScope.launch{
 result1= async{ getTripCodes() }
 result2= async{ getTrucks() }
 result3= async{ getTrailers() }
 doSomethingWithTripCodes(result1.await())
 doSomethingWIthTrucks(result2.await())
 doSomethingTrailers(result3.await())
}

Ссылка:

...