我正在使用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方法,该方法在执行调用时通知我,但尚未实现。 希望有人能帮助我而不必大幅度改变我的资产!
答案 0 :(得分:0)
这是一个异步调用,您不能使用return()
表达式返回值。
您已经通过users
方法获得了parseUsers
,只需根据需要使用即可。
return users; //delete this line, or the searchUser function will return to the caller before received response.