android - 我们可以在 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() 之外使用它们时,值会正确显示。
我知道使用改造之类的做法不是很好,但我很好奇它在这种情况下会如何反应。任何人都可以提供帮助或提供任何建议吗?
提前致谢 !!
解决方案
这是一个使用改造库进行循环的示例。如果我们使用 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);
}
});
}
推荐阅读
- amazon-web-services - QuickSight - 随着时间的推移活动事件的计数
- java - 在 wicket 6.20 中允许 CORS
- ruby-on-rails - Rails 程序中的 cookie 是什么样的东西?
- navision - 没有副本在报告中不起作用
- asp.net - WordPress 不能在同一台机器上 AJAX 到 ASP.NET.Core Web 应用程序
- wordpress - Wordpress 主页重定向到匿名页面
- r - 在坐标对的数据框中获取坐标对的行数
- cocoa - NSToolbar 中的下拉菜单,例如 Mail.app
- javascript - 求和金额后在 MongoDB 中出现“将循环结构转换为 JSON”错误
- javascript - 如何让 Promise.all 按预期执行我的承诺?