下面是一个方法,我试图通过调用getSelf()来检索用户对象。问题是结果始终为null,因为Volley请求在返回结果时尚未完成。我对异步进程有些新意,所以我不确定让方法等待API调用结果返回UserBean对象的最佳方法。谁能给我一些帮助?
public UserBean getSelf(String url){
RpcJSONObject jsonRequest = new RpcJSONObject("getSelf", new JSONArray());
JsonObjectRequest userRequest = new JsonObjectRequest(Request.Method.POST, url, jsonRequest,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
String result;
try {
result = response.getString("result");
Gson gson = new Gson();
java.lang.reflect.Type listType = new TypeToken<UserBean>() {}.getType();
//HOW DO I RETURN THIS VALUE VIA THE PARENT METHOD??
userBean = (UserBean) gson.fromJson(result, listType);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Error:", error.toString());
finish();
}
}
);
this.queue.add(userRequest);
return userBean;
}
答案 0 :(得分:11)
对于那些来自搜索&amp;谷歌。
没有理由等待异步请求完成,因为它是异步设计。如果你想使用Volley实现同步行为,你必须使用所谓的期货:
String url = "http://www.google.com/humans.txt";
RequestFuture<String> future = RequestFuture.newFuture();
StringRequest request = new StringRequest(Request.Method.GET, url, future, future)
mRequestQueue.add(request);
String result = future.get(); // this line will block
请记住,您必须在另一个线程中运行阻止代码,因此请将其包装到AsyncTask
中(否则future.get()
将永久阻止)。
答案 1 :(得分:0)
您可以使用VolleyPlus库https://github.com/DWorkS/VolleyPlus
来实现这一目标它有一个名为VolleyTickle和RequestTickle的东西。请求是一样的。它是同步请求,并且只有一个请求。