【问题标题】:Wait for result of Async Volley request and return it等待 Async Volley 请求的结果并返回
【发布时间】:2023-04-05 17:19:01
【问题描述】:

下面是我试图通过调用 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;

}   

【问题讨论】:

  • 你不应该做你想做的事。异步处理的原因是你在做“慢”的事情时不会阻塞程序或 UI。所以你的onResponse 应该通知调用者该对象可用,然后显示它。如果您需要用户等待,请弹出一个进度对话框,然后在结果可用时将其关闭。
  • 还要检查您的回复。可能是null

标签: java android asynchronous anonymous-function android-volley


【解决方案1】:

对于那些通过搜索和谷歌来回答这个问题的人。

没有理由等待异步请求完成,因为它在设计上是异步的。如果要使用 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() 将永远阻塞)。

【讨论】:

    【解决方案2】:

    您可以使用库 VolleyPlus https://github.com/DWorkS/VolleyPlus 实现此目的

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

    【讨论】:

    • 我认为在 VolleyPlus: 中,如果缓存从缓存中找到它并响应回 UI 主线程。这让我成为问题,因为如果更新 JSON,它没有更新数据。这个问题有什么解决办法吗??
    • 可以在request中使用setShouldCache方法。将 false 传递给方法,它不会缓存结果。
    猜你喜欢
    • 2021-03-23
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2016-12-05
    • 2018-07-28
    • 2019-04-08
    相关资源
    最近更新 更多