我正在尝试使用 Node 服务器请求中的值填充ArrayList
,但是在添加项目之前,该列表返回得太早。
到目前为止,这是我要做的事情:
List<String> entityList;
public RevReadAllFromServer() {
entityList = new ArrayList<>();
}
private synchronized void doWork() {
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
JSONObject json = null;
try {
json = new JSONObject(response);
} catch (JSONException e) {
e.printStackTrace();
}
JSONArray jArr = null;
try {
jArr = json.getJSONArray("filter");
} catch (JSONException e) {
e.printStackTrace();
}
for (int i = 0; i < jArr.length(); i++) {
JSONObject e;
try {
e = jArr.getJSONObject(i);
Log.v("MyApp", ">>>> User Name : " + e.getString("user_name"));
entityList.add(e.getString("user_name"));
} catch (JSONException e1) {
e1.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.v("MyApp", "That didn't work!");
}
});
queue.add(stringRequest);
}
public List<String> revReadAllFromServer() {
Thread tUI = new Thread(new Runnable() {
@Override
public void run() {
doWork();
}
});
tUI.start();
try {
tUI.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.v("MyApp", ">>> List Size : " + entityList.size());
return entityList;
}
输出:
2018-11-13 23:56:26.143 24807-28639/rev.ca.my_init_application V/MyApp: >>> List Size : 0
2018-11-13 23:56:26.400 24807-24807/rev.ca.my_init_application V/MyApp: >>>> User Name : cool_guy_101_2018
如您所见,>>> List Size : 0
在>>>> ALL REMOTE_REV_ENTITY_GUID >>> : 1
之前输出。该列表不会填充,而是在添加项目之前返回。
如何使它工作?
谢谢大家。
答案 0 :(得分:0)
那是因为您的queue.add
不是阻止方法。它只是将您的请求排队,并在执行服务线程时对它进行服务。
您可以使用RequestFuture
并调用阻塞的get
方法来在线程终止之前获取响应。
顺便说一句,如果创建线程后立即调用join
,我不知道为什么会有线程。
答案 1 :(得分:0)
您的请求是异步的,响应准备就绪后将填充列表。然后,您可以从那里将其数据用于所有其他需要的东西。
从逻辑上这样解释:执行-> REGISTER_TASK [完成任务:执行...]->返回
revReadAllFromServer()
将在启动线程后立即返回列表,这不会等待注册的新任务完成,而是在完成其自己的任务后返回。如果这样,则要使用已注册任务的结果,因此您必须聆听它的完成并将指令添加到已实现的方法中。