【发布时间】:2020-10-15 21:44:16
【问题描述】:
我知道这种奇怪的问题,但我试图在 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 按列拆分。
问题 当我检查 Response 方法中每次迭代的 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() 之外使用它们时,值显示正确。
我知道使用 Retrofit like 不是一个好习惯,但我很好奇它在这种情况下会如何反应。任何人都可以提供帮助或提供任何建议吗?
提前致谢!!
【问题讨论】:
-
是的!如此频繁地进行 API 调用是不好的做法。您可以先准备您的字符串/字符列表,然后进行一次 API 调用,只需一次调用即可接收整个列表。
-
是的,我知道并且已经这样做了,但我试图检查它会如何反应,所以你有解决这个问题的方法或任何想法吗? @JeelVankhede
-
在主循环 (在主循环中初始化它)中本地获取
seperated2变量,现在它被声明在主循环之外。 -
你的意思是在嵌套的循环内??
-
我的意思是代替
seperated2 = separated[i].split(":");,试试String[] seperated2 = separated[i].split(":");
标签: android android-studio for-loop retrofit retrofit2