1d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/* 2d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Copyright (C) 2011 The Android Open Source Project 3d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 4d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License"); 5d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * you may not use this file except in compliance with the License. 6d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * You may obtain a copy of the License at 7d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 8d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * http://www.apache.org/licenses/LICENSE-2.0 9d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 10d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software 11d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS, 12d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * See the License for the specific language governing permissions and 14d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * limitations under the License. 15d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 16d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 17d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupackage com.android.volley; 18d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 19d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport android.os.Handler; 20d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 21d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.util.concurrent.Executor; 22d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 23d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/** 24d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Delivers responses and errors. 25d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 26d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupublic class ExecutorDelivery implements ResponseDelivery { 27d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** Used for posting responses, typically to the main thread. */ 28d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private final Executor mResponsePoster; 29d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 30d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 31d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Creates a new response delivery interface. 32d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param handler {@link Handler} to post responses on 33d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 34d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public ExecutorDelivery(final Handler handler) { 35d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // Make an Executor that just wraps the handler. 36d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mResponsePoster = new Executor() { 37d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru @Override 38d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void execute(Runnable command) { 39d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru handler.post(command); 40d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 41d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru }; 42d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 43d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 44d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 45d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Creates a new response delivery interface, mockable version 46d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * for testing. 47d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param executor For running delivery tasks 48d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 49d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public ExecutorDelivery(Executor executor) { 50d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mResponsePoster = executor; 51d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 52d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 53d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru @Override 54d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void postResponse(Request<?> request, Response<?> response) { 55d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru postResponse(request, response, null); 56d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 57d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 58d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru @Override 59d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void postResponse(Request<?> request, Response<?> response, Runnable runnable) { 60d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru request.markDelivered(); 61d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru request.addMarker("post-response"); 62d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mResponsePoster.execute(new ResponseDeliveryRunnable(request, response, runnable)); 63d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 64d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 65d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru @Override 66d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void postError(Request<?> request, VolleyError error) { 67d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru request.addMarker("post-error"); 68d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru Response<?> response = Response.error(error); 69d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mResponsePoster.execute(new ResponseDeliveryRunnable(request, response, null)); 70d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 71d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 72d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 73d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * A Runnable used for delivering network responses to a listener on the 74d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * main thread. 75d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 76d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru @SuppressWarnings("rawtypes") 77d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private class ResponseDeliveryRunnable implements Runnable { 78d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private final Request mRequest; 79d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private final Response mResponse; 80d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru private final Runnable mRunnable; 81d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 82d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public ResponseDeliveryRunnable(Request request, Response response, Runnable runnable) { 83d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRequest = request; 84d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mResponse = response; 85d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRunnable = runnable; 86d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 87d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 88d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru @SuppressWarnings("unchecked") 89d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru @Override 90d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void run() { 916772bce3d3322ccbcf6481545ffe895d5d401b39Jean-Baptiste Queru // If this request has canceled, finish it and don't deliver. 926772bce3d3322ccbcf6481545ffe895d5d401b39Jean-Baptiste Queru if (mRequest.isCanceled()) { 93d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRequest.finish("canceled-at-delivery"); 94d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru return; 95d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 96d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 97d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // Deliver a normal response or error, depending. 98d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru if (mResponse.isSuccess()) { 99d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRequest.deliverResponse(mResponse.result); 100d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } else { 101d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRequest.deliverError(mResponse.error); 102d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 103d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 104d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // If this is an intermediate response, add a marker, otherwise we're done 105d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // and the request can be finished. 106d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru if (mResponse.intermediate) { 107d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRequest.addMarker("intermediate-response"); 108d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } else { 109d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRequest.finish("done"); 110d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 111d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 112d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru // If we have been provided a post-delivery runnable, run it. 113d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru if (mRunnable != null) { 114d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru mRunnable.run(); 115d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 116d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 117d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 118d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru} 119