我希望我能以正确的方式解释这个问题:) 我有一个对象数组(handleData)。我从DB获取它们。我想通过分别为每个服务器调用服务将它们发送到服务器。 我将服务放在for循环中以发送所有handleData(参考代码)。
呼叫服务是在后台完成的。每个人的反应可能不会随着他们有条不紊地发送而来。我必须为我发送的每个handleData做一些更新。
问题:当响应到来时,我不确定是否对我想要/正确发送的确切handleData进行了所考虑的操作(记录更新)。
private void sendDataOfTemplates() {
ArrayList<FormHandleData> formHandleDatas = FormHandleData.getDatasFromDB(getContext(), 12, EnumDataStatusOfServer.NoSTATUS.getIntValue(),-1);// true means >> to send / -1 means no limit
try {
if (formHandleDatas != null && formHandleDatas.size() != 0) {
for (int i = 0; i < formHandleDatas.size(); i++) {
final FormHandleData handleData = formHandleDatas.get(i);
if (handleData.status_in_server == EnumDataStatusOfServer.OPEN.getIntValue())
if (handleData.status_in_app == EnumDataStatusInApp.SAVED.getIntValue() || handleData.status_in_app == EnumDataStatusInApp.EDITED.getIntValue()) {
ServiceHelper.getInstance().sendDataOfTemplates(new ServiceHelper.ResponseListener() {
@Override
public void onResponse(String response) {
try {
SimpleResponse simple_response = new Gson().fromJson(response, SimpleResponse.class);
if (simple_response.isSuccessful()) {
handleData.status_in_app = EnumDataStatusInApp.SENT.getIntValue();
FormHandleData.UpdateDataTemplatesInDB(handleData, getContext(),false);
} else {
}
} catch (Exception e) {
}
}
@Override
public void onErrorResponse(VolleyError error) {
}
}, handleData);
}
}
}
} catch (Exception e) {
}
}
答案 0 :(得分:7)
问题:当响应到来时,我不确定是否对我想要/正确发送的确切handleData执行了所考虑的操作(记录更新)。
如果我的理解正确,那么您正在询问是否由匿名handleData
子类访问的周围局部变量ServiceHelper.ResponseListener
将始终是同一对象实例,即使在下一个{{1} } cycle该变量的值将不同。答案是肯定的。因此,您不必担心。
如果您想进一步了解匿名类如何从周围的范围捕获变量,请阅读this part of the Oracle's Java tutorial,其中说:
- 匿名类可以访问其封闭类的成员。
- 匿名类无法在其封闭范围内访问未声明为final或有效地为final的局部变量。
因此可以访问周围变量的事实意味着,从匿名类的角度来看,它是(有效)最终变量,即它不会改变。
这是一个使用多个线程的演示:
for
package de.scrum_master.app;
public class WhoDoesWhat {
private String name;
private final String action;
public WhoDoesWhat(String name, String action) {
this.name = name;
this.action = action;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name + " -> " + action;
}
}
控制台日志如下所示:
package de.scrum_master.app;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Application {
private static final Random RANDOM = new Random();
public static void main(String[] args) {
List<WhoDoesWhat> peopleDoingSomething = new ArrayList<>();
peopleDoingSomething.add(new WhoDoesWhat("Galileo", "discover moons of Jupiter"));
peopleDoingSomething.add(new WhoDoesWhat("Johannes", "determine the laws of planetary motion"));
peopleDoingSomething.add(new WhoDoesWhat("Albert", "explain the precession of Mercury"));
peopleDoingSomething.add(new WhoDoesWhat("Edwin", "notice something odd about recession speeds of galaxies"));
for (WhoDoesWhat personDoingSomething : peopleDoingSomething) {
new Thread(() -> {
System.out.println("START " + personDoingSomething);
try {
int waitCycles = 1 + RANDOM.nextInt(10);
for (int cycle = 0; cycle < waitCycles; cycle++) {
System.out.println(" " + personDoingSomething.getName() + " is still being busy");
Thread.sleep(250);
}
} catch (InterruptedException e) {
}
System.out.println("STOP " + personDoingSomething);
}).start();
}
}
}
答案 1 :(得分:3)
当每个人像递归方法一样完成时,你可以逐个发送它们。希望这对你有用..
答案 2 :(得分:0)
问题:当响应到来时,我不确定是否对我想要/正确发送的确切handleData执行了所考虑的操作(记录更新)。
我知道这是一个旧线程,但只想提供帮助........ 为了确定返回的handleData对应于formHandleDatas ArrayList的哪个元素,您可以将handleData与handleData一起发送给服务器(然后,将其发送回客户端),该ID(对于数组列表的每个元素都是唯一的)服务器返回结果。这样,就有可能找到确切的handleData。在这里,我对您的代码进行了一些重构。
private void sendDataOfTemplates() {
Map<Integer, FormHandleData> formHandleDataMap = FormHandleData.getDatasFromDBAsMap();
try {
if (formHandleDataMap != null && formHandleDataMap.size() != 0) {
formHandleDataMap.forEach((key, handleData) -> {
if (handleData.getStatusInServer() == FormHandleData.EnumDataStatusOfServer.OPEN.ordinal())
if (handleData.getStatusInApp() == FormHandleData.EnumDataStatusInApp.SAVED.ordinal() ||
handleData.getStatusInApp()== FormHandleData.EnumDataStatusInApp.EDITED.ordinal()) {
ServiceHelper.getInstance().sendDataOfTemplates(
new ServiceHelper.ResponseListener() {
@Override
public void onResponse(String response) {
try {
SimpleResponse simpleResponse = new Gson().fromJson(response, SimpleResponse.class);
FormHandleData currentHandleData = formHandleDataMap.get(simpleResponse.getKey());
if (simpleResponse.isSuccessful()) {
currentHandleData.setStatusInApp(FormHandleData.EnumDataStatusInApp.SENT.ordinal());
FormHandleData.UpdateDataTemplatesInDB(currentHandleData, getContext(), false);
} else {
System.out.println("simple response is not successful");
}
} catch (Exception e) {
System.out.println("exception happened while getting simple response:" + e.getMessage());
e.printStackTrace();
}
}
@Override
public void onErrorResponse() {
}
}, handleData);
}
});
}
} catch (Exception e) {
System.out.println("exception happened:" + e.getMessage());
e.printStackTrace();
}
}
在这里,我使用Map处理我提到的唯一ID,实际上,唯一ID是Map中handleData条目的键。希望对您有帮助。