有没有办法在Android中发送和收听凌空批量请求和响应? 我想在网络恢复后同步所有离线数据。 目前我正在使用for循环将请求添加到队列。我会为每个请求单独获取响应。 批处理请求和响应侦听器有什么办法吗?
答案 0 :(得分:1)
我遇到了同样的问题,然后我以一种愚蠢的方式解决了它。只有在批量处理中有少量请求时才有用。希望它有所帮助:)
public static void requestData(@NonNull final Context context, final String url, final String cityID, final int typeOfResult, final int batchId) {
MySingletonWraper.getInstance(context).addToRequestQueue(new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// add json object to list json of this batch
Batch batch = listBatch().get(batchID);
batch .getListRespones().add(respone);
// listBatch is a ArrayList of Object Batch which have id, queue url, list results
urlsQueue = batch .getUrlsQueue();
if (urlsQueue.isEmpty()) { // I create a queue for control in a batch, check if it's empty - this is last request
// parse JsonObject for today weather
parseJsonToWeatherObject(typeOfResult);
return;
}
// only request if sure the previous request is successed
// if have too many reuqests in a batch, just break it if you can
requestData(context, urlsQueue .poll(), cityID, typeOfResult, batchID);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// write log error
error.printStackTrace();
// refresh this batch
listBatch().refresh();
// re-request
fetch(context, cityID, batchID);
}
}));
}
答案 1 :(得分:0)
我认为批量监听器没有实际的实现。虽然可以发送多个请求,但响应不会同时到达。值得注意的是,在Volley中,网络池大小的上限为4(我相信这是由常量DEFAULT_NETWORK_THREAD_POOL_SIZE
定义的)。您可以向队列添加许多请求,但一次只能处理4个请求。到目前为止,Volley没有完成队列的回调,这在技术上是一个足够接近的批量监听器实现。
所以你仍然需要单独处理每个响应。虽然考虑到网络过程很昂贵,但我会在服务器上预处理要发送到设备的任何数据,从而无需执行多个请求。