Volley请求队列中的响应顺序是什么?

时间:2015-12-22 12:10:11

标签: android android-volley

我有一个for循环,它创建了不同的url,然后我使用add函数推送Volley RequestQueue中的url。 我有一个问题,响应列表器是否会按照添加到RequestQueue的请求的顺序进行响应,或者它将是随机的,基于请求的服务器响应? 我正在使用VolleySingleton方法。

4 个答案:

答案 0 :(得分:6)

Volley RequestQueue类管理异步请求队列。

这意味着Volley在FIFO(先进先出)模型上发送请求,但由于响应可能需要很长时间才能返回,因此它不会按特定顺序处理响应。 如果您希望在第二个请求中使用第一个请求的结果,则不能使用它。

但是,您可以明显地使用RequestFuture类在同步模型上使用Volley:

Can I do a synchronous request with volley?

答案 1 :(得分:4)

默认情况下,Volley RequestQueue将使用4个并发线程来处理添加到Requests的{​​{1}}。这可以通过扩展Queue类并将所需的线程池大小作为第三个参数传递给RequestQueue构造函数来更改。

将1传递给构造函数将导致super一次处理一个请求: - )

Reference

答案 2 :(得分:3)

没有! Android凌空进程在请求队列中异步请求:

参考架构图片:

enter image description here

请求队列中的每个请求都将由网络线程处理,您也可以限制网络调度程序线程计数检查here

答案 3 :(得分:1)

假设默认行为是在单独的并发线程上发送多个请求,那么响应的顺序将取决于每个单独请求的总响应时间。

至于识别响应(除了数据本身)之外,您似乎应该能够使用唯一的请求标识符(原始URL或int)实例化Response.Listener实现,以便在调用响应处理程序时能够区分原始请求。

public class JSONProcessor implements Response.Listener<JSONObject> {
   private String url;
   private int reqCode;

   public JSONProcessor (String reqUrl) {
      this.url = reqUrl
   }

   public JSONProcessor (int reqCode) {
      this.reqCode = reqCode;
   }

   public void onResponse(JSONObject response) {
      // use this.url or this.reqCode to determine original request
      // process response
   }
}

或者,为您希望处理的每个端点使用Response.Listener的不同实现。

总的来说,在我看来,如果可能的话,最好是完全由数据驱动。