在将项目添加到ArrayList

时间:2018-11-13 21:32:21

标签: java android arraylist

我正在尝试使用 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之前输出。该列表不会填充,而是在添加项目之前返回。

如何使它工作?

谢谢大家。

2 个答案:

答案 0 :(得分:0)

那是因为您的queue.add不是阻止方法。它只是将您的请求排队,并在执行服务线程时对它进行服务。

您可以使用RequestFuture并调用阻塞的get方法来在线程终止之前获取响应。

顺便说一句,如果创建线程后立即调用join,我不知道为什么会有线程。

答案 1 :(得分:0)

您的请求是异步的,响应准备就绪后将填充列表。然后,您可以从那里将其数据用于所有其他需要的东西。

从逻辑上这样解释:执行-> REGISTER_TASK [完成任务:执行...]->返回

revReadAllFromServer()将在启动线程后立即返回列表,这不会等待注册的新任务完成,而是在完成其自己的任务后返回。如果这样,则要使用已注册任务的结果,因此您必须聆听它的完成并将指令添加到已实现的方法中。