首页 > 解决方案 > 我们可以在 android studio 的循环中使用 Retrofit 吗?

问题描述

我知道这种奇怪的问题,但我试图在 for 循环中使用我的 Retrofit 调用。我正在做的是在调用中一一发送我的 String[] 元素insertdata(seperated2[0], seperated2[1], email, tag);

但是当他们跳过匿名调用时,循环的行为很奇怪call.enqueue(......onResponse(...) onfailure(.....))

不是用循环控制调用它,而是首先完成循环,然后调用 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[] 将它们按行拆分,而 seperated2 将它们按列拆分。

问题当我在响应方法中检查每次迭代的 seperated2[0] 和 seperated2[1] 值时,它应该是

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() 之外使用它们时,值会正确显示。

我知道使用改造之类的做法不是很好,但我很好奇它在这种情况下会如何反应。任何人都可以提供帮助或提供任何建议吗?

提前致谢 !!

标签: androidandroid-studiofor-loopretrofitretrofit2

解决方案


这是一个使用改造库进行循环的示例。如果我们使用 for 循环,则所有迭代都不会立即调用 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);
        }
    });
}

推荐阅读