package com.android.volley;
public class SyncDispatcher {
private Cache cache;
private Network network;
public SyncDispatcher(Cache cache, Network network) {
this.cache = cache;
this.network = network;
}
public <T> SyncResponse<T> processRequest(Request<T> request) {
try {
request.addMarker("request-sync-start");
request.addMarker("request-sync-thread [" + Thread.currentThread().getName() + "]");
if (request.isCanceled() || request.hasHadResponseDelivered()) {
request.addMarker("request-sync-already-delivered");
finishRequest(request);
return new SyncResponse<>(new VolleyError("request canceled or already handled"));
}
//Check the cache for an entry
String cacheKey = request.getCacheKey();
Cache.Entry cacheEntry = cache.get(cacheKey);
if (cacheEntry == null || cacheEntry.isExpired() || cacheEntry.refreshNeeded()) {
// set the cache entry to allow for handling of 304s in the network
request.setCacheEntry(cacheEntry);
request.addMarker("request-sync-cache-miss");
//cache miss or dead entry execute network to fill the cache
Response<T> response = executeNetwork(request);
request.addMarker("request-sync-http-done");
if (!response.cacheEntry.isExpired() && request.shouldCache()) {
cache.put(cacheKey, response.cacheEntry);
request.addMarker("request-sync-cache-written");
}
finishRequest(request);
return new SyncResponse<>(response.result);
} else {
request.addMarker("request-sync-cache-hit");
//cache hit, parse the cached result
Response<T> response = parseResponse(new NetworkResponse(cacheEntry.data, cacheEntry.responseHeaders), request);
request.addMarker("request-sync-cache-delivered");
finishRequest(request);
return new SyncResponse<>(response.result);
}
} catch (VolleyError volleyError) {
request.addMarker("request-sync-error " + volleyError.getMessage());
finishRequest(request);
return new SyncResponse<>(volleyError);
} catch (Exception exception) {
request.addMarker("request-sync-cache-delivered " + exception.getMessage());
finishRequest(request);
return new SyncResponse<>(new VolleyError(exception));
}
}
private static void finishRequest(Request<?> request) {
request.markDelivered();
request.logMarkers();
}
private <T> Response<T> executeNetwork(Request<T> request) throws VolleyError {
request.addMarker("request-sync-execute-network");
NetworkResponse response = network.performRequest(request);
return parseResponse(response, request);
}
private <T> Response<T> parseResponse(NetworkResponse networkResponse, Request<T> request) {
request.addMarker("request-sync-parse-response");
return request.parseNetworkResponse(networkResponse);
}
}