@Override public void fetch(final VolleyNetworkFetchState fetchState, final Callback callback) { fetchState.submitTime = SystemClock.elapsedRealtime(); final RawRequest request = new RawRequest( fetchState.getUri().toString(), new Response.Listener<byte[]>() { @Override public void onResponse(byte[] bytes) { fetchState.responseTime = SystemClock.uptimeMillis(); try { InputStream is = new ByteArrayInputStream(bytes); callback.onResponse(is, bytes.length); } catch (IOException e) { callback.onFailure(e); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { callback.onFailure(volleyError); } }); fetchState.getContext().addCallbacks( new BaseProducerContextCallbacks() { @Override public void onCancellationRequested() { mRequestQueue.cancelAll(new RequestFilter() { @Override public boolean apply(Request<?> candidate) { return candidate != null && request.getSequence() == candidate.getSequence(); } }); } }); mRequestQueue.add(request); }
@Override public void fetch(final FetchState fetchState, final Callback callback) { final Future<?> future = mExecutorService.submit( new Runnable() { @Override public void run() { HttpURLConnection connection = null; Uri uri = fetchState.getUri(); String scheme = uri.getScheme(); String uriString = fetchState.getUri().toString(); while (true) { String nextUriString; String nextScheme; InputStream is; try { connection = createConnection(uriString); nextUriString = connection.getHeaderField("Location"); nextScheme = (nextUriString == null) ? null : Uri.parse(nextUriString).getScheme(); if (nextUriString == null || nextScheme.equals(scheme)) { is = connection.getInputStream(); callback.onResponse(is, -1); break; } uriString = nextUriString; scheme = nextScheme; } catch (Exception e) { callback.onFailure(e); break; } finally { if (connection != null) { connection.disconnect(); } } } } }); fetchState.getContext().addCallbacks( new BaseProducerContextCallbacks() { @Override public void onCancellationRequested() { if (future.cancel(false)) { callback.onCancellation(); } } }); }