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

Я пытаюсь провести эксперимент с несколькими запросами, используя AsyncHttpClient из списка данных. Я использую AsyncTask для обработки нескольких запросов от них. Вывод, который я хочу ожидать, - когда все данные обновляются с помощью запроса, тогда вы можете ответить всеми данными (одной или несколькими данными), отправленными клиенту в одном ответе. Вот что я пытаюсь кодировать:

Это слушатель запроса кода при нажатии. Я передаю массив параметров Lamp (Lamp[] lamps) для обработки в AsyncTask на множественный запрос

    View.OnClickListener addDeviceListener = view -> {
            // send to DeviceControllerTask
            DevicesAdderTask adderTask = new DevicesAdderTask(handler, email);
            Lamp[] lamps = listPhilipsHue.toArray(new Lamp[listPhilipsHue.size()]);
            adderTask.execute(lamps);
        };

Код Asynctask и JsonHttpResponseHandler

    public class DevicesAdderTask extends AsyncTask<Lamp, Void, Integer> {

        private ArrayList<Lamp> lampArrayList;

        private String email;

        private Handler handler;


        public DevicesAdderTask(Handler handler, String email) {
            this.handler        = handler;
            this.email          = email;
        }

        @Override
        protected Integer doInBackground(Lamp... lamps) {
            final Integer[] count = {0};
            for (Lamp lamp: lamps
            ) {
                DeviceUserRequestTask.setPostAddUserDevice(email, lamp, 3, new JsonHttpResponseHandler(){
                    @Override
                    public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                        super.onSuccess(statusCode, headers, response);

                        System.out.println("response: "+response);

                        int status = 0;
                        try {
                            status = response.getInt("status");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        if (status == 200 || status == 300) {
                            count[0]++;
                            System.out.println("count: "+ count[0]);
                        }
                    }

                    @Override
                    public boolean getUseSynchronousMode() {
                        return false;
                    }
                });
            }
            return count[0];
        }

        @Override
        protected void onPostExecute(Integer count) {

            Log.d(TAG, "Post Execute result: "+count);

            if (count>0) {
                // send to handler success add
            } else {
                // send to error success add
            }
        }
    }

Обработчик ответа работает хорошо, и нет проблема вообще. Но я обнаружил, что onPostExecute() запускается первым до того, как обработчик ответа завершил подсчет, поэтому результат подсчета всегда 0 и обработка в «обработчике ошибок»

...