6

下面是我试图通过调用 getSelf() 来检索用户对象的方法。问题是结果始终为空,因为在返回结果时 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;

}   
4

2 回答 2

15

对于那些从搜索和谷歌来这个问题的人。

没有理由等待异步请求完成,因为它在设计上是异步的。如果要使用 Volley 实现同步行为,则必须使用所谓的futures

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()将永远阻塞)。

于 2015-06-26T13:53:55.957 回答
0

您可以使用库 VolleyPlus https://github.com/DWorkS/VolleyPlus来实现这一点

它有一个叫做 VolleyTickle 和 RequestTickle 的东西。请求是一样的。它是同步请求,一次只有一个请求。

于 2014-03-07T12:05:58.780 回答