【问题标题】:How do I wait for response of Volley?如何等待 Volley 的响应?
【发布时间】:2022-01-06 18:42:51
【问题描述】:

总结一下我的问题,我有一个使用 Android Volley Library 编写的请求。

我需要填写 chartDataList 。但是每当我调用该方法时就会出现问题,它会在 3 秒后返回一个空数组,它会异步填充自己。我想等待回复,但我不知道该怎么做?

这是我的代码:

 public List<ChartData> getVolleyResponse() {
        requestQueue = Volley.newRequestQueue(getApplicationContext());
        JsonObjectRequest req = new JsonObjectRequest(
                Request.Method.GET,
                urlCreator(getCoinName()),
                null,
                response -> {
                    try {
                        JSONArray arr = response.getJSONArray("prices");
                        ChartData chartData = new ChartData();
                        for (int i = 0; i < arr.length(); i++) {
                            JSONArray jsonArray = arr.getJSONArray(i);
                            chartData.setTimeStamp(timeStampConverter(jsonArray.getString(0)));
                            chartData.setCost(jsonArray.getDouble(1));
                            chartDataList.add(chartData);
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                },
                error -> {
                    Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_LONG).show();
                });
        requestQueue.add(req);
        return chartDataList;
}

【问题讨论】:

  • Volley 请求被设计为异步运行。您是否有理由尝试使请求同步,而不是构建您的逻辑以异步工作?
  • @SammyT 我只想知道列表何时全部填满。然后我将创建一个包含填充列表的图表。我想让我的方法在填充时返回列表而不是在它为空时。

标签: java android asynchronous arraylist android-volley


【解决方案1】:

Response 函数是一个回调函数,将在您的请求处理完毕/服务器响应后执行。我建议执行您的逻辑,该逻辑取决于您的响应函数回调中的响应数据。这是非阻塞的,但适用于 Volley 的异步设计:

 public List<ChartData> getVolleyResponse() {
    requestQueue = Volley.newRequestQueue(getApplicationContext());
    JsonObjectRequest req = new JsonObjectRequest(
            Request.Method.GET,
            urlCreator(getCoinName()),
            null,
            response -> {
                try {
                    JSONArray arr = response.getJSONArray("prices");
                    ChartData chartData = new ChartData();
                    for (int i = 0; i < arr.length(); i++) {
                        JSONArray jsonArray = arr.getJSONArray(i);
                        chartData.setTimeStamp(timeStampConverter(jsonArray.getString(0)));
                        chartData.setCost(jsonArray.getDouble(1));
                        chartDataList.add(chartData);
                    }
                    
                    // The request has processed/server has responded.
                    // Do something with your response here.
                    // ...

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            },
            error -> {
                Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_LONG).show();
            });
    requestQueue.add(req);
    
    // We're handling the response asynchronously, so there shouldn't be anything to return here.
}

【讨论】:

  • 这就是我想知道的。非常感谢,这些信息解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 2017-04-14
  • 2022-07-01
  • 1970-01-01
  • 2020-03-07
  • 2014-12-21
  • 1970-01-01
相关资源
最近更新 更多