Android Запрос цикла модернизации не выполняет обратный вызов - PullRequest
0 голосов
/ 05 августа 2020

У меня проблема со студией android и библиотекой для модернизации, а также с тем, как она обрабатывает данные.

У меня есть простая последовательность операций, которую я хотел бы: 1005 * Запрос одного элемента из базы данных на сервере (запрос на выборку)

Дождитесь обратного вызова, чтобы подтвердить, что он был получен приложением Добавить еще один запрос (L oop) Прекратить добавление запросов, когда все данные отправлены

У меня проблема заключается в том, что мой обратный вызов onResponse для моего результата выборки не запускается, пока не будут отправлены все мои запросы. Тогда все ответы - ошибки. (Если я вызываю один элемент (1 из базы данных)), обратный вызов выполняется нормально.

Как заставить его отправить один запрос и дождаться этого ответа перед отправкой другого?

L oop код

private void Pull_data_loop(int total_entries){
        //int current_data_point = 0;
        boolean datum_processing = false;

        for (int i = 1; i <= total_entries; i++) {

            Add_single_datam(i);//Call until all entries are fetched from the server
        }
    }

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

private void Add_single_datam(int id)
    {
        HashMap<String, String> map = new HashMap<>();
        map.put("Id_request", Integer.toString(id));//The ID value
        Call<Fetch_result> call = retrofitInterface.executeGet_data(map);//Run the post
        call.enqueue(new Callback<Fetch_result>() {
            @Override
            public void onResponse(Call<Fetch_result> call, Response<Fetch_result> response) {
                if (response.code() == 200)//Successful login
                {
                    D1= response.body().getD1_String();
                    D2= response.body().getD2_String();
                   

                    boolean result = BLE_DB.addData_Downloaded(D1, D2);//Add data
                    if (result == true) {
                        Log.d(TAG, "data_changes: Added data correctly");
                    }
                    if (result == false) {
                        Log.d(TAG, "data_changes: did not add data correctly");
                    }//false

                } else if (response.code() == 404) {
                    Utils.toast(getApplicationContext(), "Get data fail");//Pass information to the display
                }
            }

            @Override
            public void onFailure(Call<Fetch_result> call, Throwable t) {
                Utils.toast(getApplicationContext(), "Get data error");
            }
        });
    }

Примечание:

Я использую сервер node js для своих запросов. Я отправляю идентификатор, и он возвращает этот идентификатор в базе данных.

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

используйте некоторые решения для потоковой передачи, такие как Rx Java, Coroutines или AsyncTask. Причина, по которой он не следует правилу, заключается в том, что есть два потока, по которым распределяется работа, поэтому, чтобы заставить его работать синхронно c, мы должны использовать некоторые решения для потоковой передачи, упомянутые выше, и выполнить это для l oop в фоновом потоке и сделайте его синхронным вызовом, получите все результаты и, наконец, переключитесь обратно на основной поток с результатами.

Если вы знакомы с AsynTask.

 private class FetchDataTask extends AsyncTask<Int, Integer, List<Fetch_result>> {
 protected Long doInBackground(Int... total_entries) {
 List<Fetch_result> allResults = new ArrayList<Fetch_result>();
     for (int i = 1; i <= total_entries[0]; i++) {
       HashMap<String, String> map = new HashMap<>();
       map.put("Id_request", Integer.toString(total_entries[0]));
       Fetch_result response = retrofitInterface.executeGet_data(map).execute().body(); 
       allResults.add(response);
    } 
     return allResults;
 }

 protected void onProgressUpdate(Integer... progress) {
     //show progress 
 }

 protected void onPostExecute(List<Fetch_result> result) {
     //do something on main thread, in loop on result
      D1= result[0].getD1_String();
      D2= result[0].getD2_String();
      boolean result = BLE_DB.addData_Downloaded(D1, D2);//Add data
      if (result == true) {
          Log.d(TAG, "data_changes: Added data correctly");
       }
       if (result == false) {
           Log.d(TAG, "data_changes: did not add data correctly");
       }//false
 }
}

теперь звоните вот так.

new FetchDataTask().execute(total_entries);
0 голосов
/ 05 августа 2020

Вы можете отправить экземпляр callBack на свой Add_single_datam, а затем в своем ответе на модификацию отправить на этот успешный обратный вызов. Затем в этом callBack у вас будет iteravel i, и вы сможете увидеть, достигли ли вы конца total_entries, добавили +1 в i и снова сделать запрос или просто остановиться.

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