Как заставить код ждать всех запросов на завершение Android охттп - PullRequest
0 голосов
/ 13 октября 2019

        for(String number : numbers) {
            RequestBody formBody = null;

           ...


            client.newCall(request).enqueue(new Callback() {
               ....

                @Override
                public void onResponse(Call call, Response response) throws IOException {

                   //blahblah
                }
            });

        }



here's the code that needs to wait for all of the responses above to arrive
        Intent myIntent = new Intent(context, PaidActivity.class);
        //blahblah
        context.startActivity(myIntent);
        context.finish();

    }

Как заставить это намерение ждать завершения обратных вызовов? Как остановиться и продолжить только после получения всех ответов от сервера?

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Простое добавление этих кодов в метод onResponse () решит вашу проблему. О, не забудьте проверить и обернуть с if(response.isSuccessful()):

  if(response.isSuccessful()) {
    Intent myIntent = new Intent(context, PaidActivity.class);
    //blahblah
    context.startActivity(myIntent);
    context.finish();
  }

Надеюсь, это поможет

0 голосов
/ 13 октября 2019

Вам понадобится какой-то счетчик, отслеживающий все ваши запросы и выполняющий некоторый код, когда они все завершатся. Быстрое и грязное решение будет выглядеть примерно так:

AtomicInteger counter = new AtomicInteger(numbers.length);
for (String number : numbers) {
    RequestBody formBody = null;
    // ...
    client.newCall(request).enqueue(new Callback() {
        // ...

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            int currentCount = counter.decrementAndGet();
            if (currentCount <= 0) {
                // You might need to call this on the UI thread.
                Intent myIntent = new Intent(context, PaidActivity.class);
                context.startActivity(myIntent);
                context.finish();
            }
        }
    });
}

Я бы порекомендовал более реактивный подход, например, с помощью. RxJava вместо анонимного обратного вызова.

...