无法从Volley的响应中接收数据(异步调用)

时间:2018-12-14 21:13:18

标签: android android-volley

我正在使用Volley作为HTTP库来处理我的Web通信,并且由于我通常处理的每个响应都是JSON或String,所以它工作得很好。

我唯一遇到的问题是使用JSON数组响应的特定调用,该数组可以正确解析,但是我无法返回“解析”值,因为返回发生在调用完成之前,最终显示为null

以下是一些代码:

private ArrayList <User> users;

public ArrayList<User> searchUser(final String usernamestart){

    users= new ArrayList<>();

    StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String serverResponse) {
            parseUsers(serverResponse);
            // see following snippet
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            Toast.makeText(context, "Unable to retrieve data", Toast.LENGTH_LONG).show();
        }
    }) {
        // parameters of POST request
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("session_id", session_id);
            params.put("usernamestart", usernamestart);

            return params;
        }
    };//closes string request

    VolleyQueue.add(request);
    return users;
}    

解析响应,并且工作得很好,我正在使用:

private void parseUsers(String jsonResponse){
    try {
        JSONObject jsonObject = new JSONObject(jsonResponse);
        JSONArray array= jsonObject.getJSONArray("users");

        for(int i=0; i < array.length(); i++){
            JSONObject pointedUser= array.getJSONObject(i);
            String username= pointedUser.getString("name");
            String picture= pointedUser.getString("picture");

            users.add(new User(username, picture));
        }
    }catch (JSONException e){
        e.printStackTrace();
    }
}  

问题在于return users发生在通话完成之前。我无法在users内返回ArrayList onResponse,因为它是一个无效方法...我真的找不到任何解决方案。

我也尝试过同步呼叫,但这不是我想要的。我想要的是Volley方法,该方法在执行调用时通知我,但尚未实现。 希望有人能帮助我而不必大幅度改变我的资产!

1 个答案:

答案 0 :(得分:0)

这是一个异步调用,您不能使用return()表达式返回值。 您已经通过users方法获得了parseUsers,只需根据需要使用即可。

 return users; //delete this line, or the searchUser function will return to the caller before received response.