Можем ли мы использовать Retrofit внутри цикла в Android Studio? - PullRequest
0 голосов
/ 07 февраля 2019

Я знаю этот странный вопрос, но я пытаюсь использовать мой вызов Retrofit внутри цикла for.Что я делаю, так это отправляю мои элементы String [] один за другим в вызове с помощью func, например insertdata(seperated2[0], seperated2[1], email, tag);

Но цикл ведет себя странно, когда пропускает анонимный вызов для call.enqueue(......onResponse(...) onfailure(.....))

Вместо того, чтобы вызывать его с помощью элемента управления loop, сначала он завершает цикл, а затем приходит в call.enqueue и всегда последний элемент в цикле.Вот как выглядит цикл ....

 separated = currentString.split("\n");
for (int i=1; i<separated.length; i++) {
        seperated2 = separated[i].split(":");


        for (String aSeperated2 : seperated2) {
            Call<ServerResponse2> call = requestInterface.insertQrdata(seperated2[0], seperated2[1], email, tag);
            call.enqueue(new Callback<ServerResponse2>() {
                @Override
                public void onResponse(Call<ServerResponse2> call, Response<ServerResponse2> response) {
                    ServerResponse2 serverResponse2 = response.body();
                    Toast.makeText(getActivity(), serverResponse2 != null ? serverResponse2.getMessage() : null, Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(Call<ServerResponse2> call, Throwable t) {
                    Toast.makeText(getActivity(), t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
                }
            });

        }

    }

вот пример для seperated [] и seperated2 []

0 1
2 3
4 5
6 7
7 8
9 10

seperated [] разделяет их на строки и разделяет2разделяет их по столбцам.

Проблема Когда я проверяю значение seperated2 [0] и seperated2 [1] для каждой итерации метода Response, оно должно быть

sep2[0]= 0 sep2[1] = 1 
        2           3
and so on... for each iteration 

но в каждой итерации значение в onResponse всегда является последним, то есть

sep2[0] = 9  sep2[1] = 10
untill the length (say 6) same value at each iteration.

Я не знаю, делаю ли я что-то не так, но значения отображаются правильно, когда я использую их вне onResponse ().

Я знаю, что использование подобной модификации не является хорошей практикой, но мне было интересно, как она отреагирует в этой ситуации.Кто-нибудь может помочь или дать какие-либо предложения?

СПАСИБО ЗА ПРЕДЕЛА !! !!

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Согласно Моему предложению не используйте петли для этого типа операций.Это плохая идея. Если вы можете видеть производительность.

Вы можете сделать это следующим образом:

Модернизация - это просто вызов URL сервера и передача ваших данных на сервер.Поэтому любой процесс, выполняющий на стороне сервера, вы можете изменить на выполнение только один раз, а не каждый раз.

Вы можете один раз передать данные всего цикла в формате json на сервер и выполнить все циклы на стороне сервера.Это будет лучше для вас.

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

Дайте мне знать, если у вас возникнут проблемы.

0 голосов
/ 17 апреля 2019

Вот пример зацикливания с модифицированной библиотекой. Если мы используем для зацикливания, call.enqueue не будет вызываться мгновенно для всех итераций. Поэтому используйте эту модель.

private void UploadImagesTask(final String image, final int position) {
    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
    File file = new File(image);
    RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
    MultipartBody.Part photoArray = MultipartBody.Part.createFormData("photo", file.getName(), reqFile);
    HashMap<String, RequestBody> params = new HashMap<>();
    params.put("token", Utils.createPartFromString(pref.getToken()));
    params.put("app_id", Utils.createPartFromString(pref.getAppId()));
    Call<ImageUploadResponse> imageUploadResponseCall = apiService.uploadImage(photoArray, params);
    imageUploadResponseCall.enqueue(new Callback<ImageUploadResponse>() {
        @Override
        public void onResponse(@NonNull Call<ImageUploadResponse> call, @NonNull Response<ImageUploadResponse> response) {

            if (response.isSuccessful()) {
                urlList.add(Objects.requireNonNull(response.body()).getUrl());
                completeData.remove(position);
                completeData.add(position, getString(R.string.uploaded));
                uploadAdapter.notifyDataSetChanged();
                pref.setTempData(Constants.IMAGE_UPLOADED, gson.toJson(urlList));
                if (position != uriData.size() - 1) {
                    int posi = position + 1;
                    CompressImages(posi);
                } else {
                    uploadDone.setActivated(true);
                    uploadDone.setEnabled(true);
                }
            } else {
                Utils.showSnackView(getString(R.string.error_occurred), snackView);
                uploadDone.setActivated(true);
                uploadDone.setEnabled(true);
            }
        }

        @Override
        public void onFailure(@NonNull Call<ImageUploadResponse> call, @NonNull Throwable t) {
            Utils.showSnackView(getString(R.string.error_occurred), snackView);
            uploadDone.setActivated(true);
            uploadDone.setEnabled(true);
        }
    });
}
0 голосов
/ 07 февраля 2019

Вместо использования for, вы также можете использовать рекурсию.API будет вызываться снова и снова, но только после получения ответа предыдущего индекса.В методе onResponse () вы можете вызвать метод, увеличив значение индекса.Поскольку в цикле for итерация не будет ждать завершения выполнения вашего ответа API, она перейдет к следующей итерации.

Если вы все еще хотите использовать цикл, перейдите к циклу while

пример для рекурсии:

    int i=1;
    separated = currentString.split("\n");

    void callMethod(){
seperated2 = separated[i].split(":");
 Call<ServerResponse2> call = requestInterface.insertQrdata(seperated2[0], seperated2[1], email, tag);
            call.enqueue(new Callback<ServerResponse2>() {
    @Override
    public void onResponse(Call<ServerResponse2> call, Response<ServerResponse2> response) {
            ServerResponse2 serverResponse2 = response.body();
            Toast.makeText(getActivity(), serverResponse2 != null ? serverResponse2.getMessage() : null, Toast.LENGTH_SHORT).show();
            i++;
            callMethod();
            }

    @Override
    public void onFailure(Call<ServerResponse2> call, Throwable t) {
            Toast.makeText(getActivity(), t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
            }
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...