1818 limitations under the License.
1919*/
2020
21- import android .os .Handler ;
22- import android .os .Looper ;
2321import android .os .Message ;
2422import android .util .Log ;
2523
26- import org .apache .http .Header ;
2724import org .apache .http .HttpEntity ;
28- import org .apache .http .HttpResponse ;
29- import org .apache .http .StatusLine ;
30- import org .apache .http .client .HttpResponseException ;
3125import org .apache .http .util .ByteArrayBuffer ;
3226
3327import java .io .IOException ;
3428import java .io .InputStream ;
35- import java .lang .ref .WeakReference ;
36- import java .net .URI ;
3729import java .util .Arrays ;
3830
39- /**
40- * Used to intercept and handle the responses from requests made using {@link AsyncHttpClient}. The
41- * {@link #onSuccess(int, org.apache.http.Header[], byte[])} method is designed to be anonymously
42- * overridden with your own response handling code. <p> </p> Additionally, you can override the
43- * {@link #onFailure(int, org.apache.http.Header[], byte[], Throwable)}, {@link #onStart()}, {@link
44- * #onFinish()}, {@link #onRetry(int)} and {@link #onProgress(int, int)} methods as required.
45- * <p> </p> For example: <p> </p>
46- * <pre>
47- * AsyncHttpClient client = new AsyncHttpClient();
48- * client.get("http://www.google.com", new AsyncHttpResponseHandler() {
49- * @Override
50- * public void onStart() {
51- * // Initiated the request
52- * }
53- *
54- * @Override
55- * public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
56- * // Successfully got a response
57- * }
58- *
59- * @Override
60- * public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable
61- * error)
62- * {
63- * // Response failed :(
64- * }
65- *
66- * @Override
67- * public void onRetry() {
68- * // Request was retried
69- * }
70- *
71- * @Override
72- * public void onProgress(int bytesWritten, int totalSize) {
73- * // Progress notification
74- * }
75- *
76- * @Override
77- * public void onFinish() {
78- * // Completed the request (either success or failure)
79- * }
80- * });
81- * </pre>
82- */
83- /**
84- * Created by vkr on 14.11.13.
85- */
86- public abstract class DataAsyncHttpResponseHandler implements ResponseHandlerInterface {
87- private static final String LOG_TAG = "AsyncHttpResponseHandler" ;
31+ public abstract class DataAsyncHttpResponseHandler extends AsyncHttpResponseHandler {
32+ private static final String LOG_TAG = "DataAsyncHttpResponseHandler" ;
8833
89- protected static final int SUCCESS_MESSAGE = 0 ;
90- protected static final int FAILURE_MESSAGE = 1 ;
91- protected static final int START_MESSAGE = 2 ;
92- protected static final int FINISH_MESSAGE = 3 ;
93- protected static final int PROGRESS_DATA_MESSAGE = 4 ;
94- protected static final int RETRY_MESSAGE = 5 ;
95-
96- protected static final int BUFFER_SIZE = 4096 ;
97-
98- private Handler handler ;
99- public static final String DEFAULT_CHARSET = "UTF-8" ;
100- private String responseCharset = DEFAULT_CHARSET ;
101- private Boolean useSynchronousMode = false ;
102-
103- private URI requestURI = null ;
104- private Header [] requestHeaders = null ;
105-
106- @ Override
107- public URI getRequestURI () {
108- return this .requestURI ;
109- }
110-
111- @ Override
112- public Header [] getRequestHeaders () {
113- return this .requestHeaders ;
114- }
115-
116- @ Override
117- public void setRequestURI (URI requestURI ) {
118- this .requestURI = requestURI ;
119- }
120-
121- @ Override
122- public void setRequestHeaders (Header [] requestHeaders ) {
123- this .requestHeaders = requestHeaders ;
124- }
125-
126- /**
127- * Avoid leaks by using a non-anonymous handler class with a weak reference
128- */
129- static class ResponderHandler extends Handler {
130- private final WeakReference <DataAsyncHttpResponseHandler > mResponder ;
131-
132- ResponderHandler (DataAsyncHttpResponseHandler service ) {
133- mResponder = new WeakReference <DataAsyncHttpResponseHandler >(service );
134- }
135-
136- @ Override
137- public void handleMessage (Message msg ) {
138- DataAsyncHttpResponseHandler service = mResponder .get ();
139- if (service != null ) {
140- service .handleMessage (msg );
141- }
142- }
143- }
144-
145- @ Override
146- public boolean getUseSynchronousMode () {
147- return useSynchronousMode ;
148- }
149-
150- @ Override
151- public void setUseSynchronousMode (boolean value ) {
152- useSynchronousMode = value ;
153- }
154-
155- /**
156- * Sets the charset for the response string. If not set, the default is UTF-8.
157- *
158- * @param charset to be used for the response string.
159- * @see <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html">Charset</a>
160- */
161- public void setCharset (final String charset ) {
162- this .responseCharset = charset ;
163- }
164-
165- public String getCharset () {
166- return this .responseCharset == null ? DEFAULT_CHARSET : this .responseCharset ;
167- }
34+ protected static final int PROGRESS_DATA_MESSAGE = 6 ;
16835
16936 /**
17037 * Creates a new AsyncHttpResponseHandler
17138 */
17239 public DataAsyncHttpResponseHandler () {
173- // Set up a handler to post events back to the correct thread if possible
174- if (Looper .myLooper () != null ) {
175- handler = new ResponderHandler (this );
176- }
40+ super ();
17741 }
17842
17943 /**
@@ -184,101 +48,18 @@ public DataAsyncHttpResponseHandler() {
18448 public void onProgressData (byte [] responseBody ) {
18549 }
18650
187- /**
188- * Fired when the request is started, override to handle in your own code
189- */
190- public void onStart () {
191- }
192-
193- /**
194- * Fired in all cases when the request is finished, after both success and failure, override to
195- * handle in your own code
196- */
197- public void onFinish () {
198- }
199-
200- /**
201- * Fired when a request returns successfully, override to handle in your own code
202- *
203- * @param statusCode the status code of the response
204- * @param headers return headers, if any
205- * @param responseBody the body of the HTTP response from the server
206- */
207- public abstract void onSuccess (int statusCode , Header [] headers , byte [] responseBody );
208-
209- /**
210- * Fired when a request fails to complete, override to handle in your own code
211- *
212- * @param statusCode return HTTP status code
213- * @param headers return headers, if any
214- * @param responseBody the response body, if any
215- * @param error the underlying cause of the failure
216- */
217- public abstract void onFailure (int statusCode , Header [] headers , byte [] responseBody , Throwable error );
218-
219- /**
220- * Fired when a retry occurs, override to handle in your own code
221- *
222- * @param retryNo number of retry
223- */
224- public void onRetry (int retryNo ) {
225- Log .d (LOG_TAG , String .format ("Request retry no. %d" , retryNo ));
226- }
227-
228- final public void sendProgressMessage (int bytesWritten , int bytesTotal ) {
229- }
23051
23152 final public void sendProgressDataMessage (byte [] responseBytes ) {
23253 sendMessage (obtainMessage (PROGRESS_DATA_MESSAGE , new Object []{responseBytes }));
23354 }
23455
235- final public void sendSuccessMessage (int statusCode , Header [] headers , byte [] responseBytes ) {
236- sendMessage (obtainMessage (SUCCESS_MESSAGE , new Object []{statusCode , headers , responseBytes }));
237- }
238-
239- final public void sendFailureMessage (int statusCode , Header [] headers , byte [] responseBody , Throwable throwable ) {
240- sendMessage (obtainMessage (FAILURE_MESSAGE , new Object []{statusCode , headers , responseBody , throwable }));
241- }
242-
243- final public void sendStartMessage () {
244- sendMessage (obtainMessage (START_MESSAGE , null ));
245- }
246-
247- final public void sendFinishMessage () {
248- sendMessage (obtainMessage (FINISH_MESSAGE , null ));
249- }
250-
251- final public void sendRetryMessage (int retryNo ) {
252- sendMessage (obtainMessage (RETRY_MESSAGE , new Object []{retryNo }));
253- }
254-
25556 // Methods which emulate android's Handler and Message methods
57+ @ Override
25658 protected void handleMessage (Message message ) {
59+ super .handleMessage (message );
25760 Object [] response ;
25861
25962 switch (message .what ) {
260- case SUCCESS_MESSAGE :
261- response = (Object []) message .obj ;
262- if (response != null && response .length >= 3 ) {
263- onSuccess ((Integer ) response [0 ], (Header []) response [1 ], (byte []) response [2 ]);
264- } else {
265- Log .e (LOG_TAG , "SUCCESS_MESSAGE didn't got enough params" );
266- }
267- break ;
268- case FAILURE_MESSAGE :
269- response = (Object []) message .obj ;
270- if (response != null && response .length >= 4 ) {
271- onFailure ((Integer ) response [0 ], (Header []) response [1 ], (byte []) response [2 ], (Throwable ) response [3 ]);
272- } else {
273- Log .e (LOG_TAG , "FAILURE_MESSAGE didn't got enough params" );
274- }
275- break ;
276- case START_MESSAGE :
277- onStart ();
278- break ;
279- case FINISH_MESSAGE :
280- onFinish ();
281- break ;
28263 case PROGRESS_DATA_MESSAGE :
28364 response = (Object []) message .obj ;
28465 if (response != null && response .length >= 1 ) {
@@ -291,71 +72,6 @@ protected void handleMessage(Message message) {
29172 Log .e (LOG_TAG , "PROGRESS_DATA_MESSAGE didn't got enough params" );
29273 }
29374 break ;
294- case RETRY_MESSAGE :
295- response = (Object []) message .obj ;
296- if (response != null && response .length == 1 )
297- onRetry ((Integer ) response [0 ]);
298- else
299- Log .e (LOG_TAG , "RETRY_MESSAGE didn't get enough params" );
300- break ;
301- }
302- }
303-
304- protected void sendMessage (Message msg ) {
305- if (getUseSynchronousMode () || handler == null ) {
306- handleMessage (msg );
307- } else if (!Thread .currentThread ().isInterrupted ()) { // do not send messages if request has been cancelled
308- handler .sendMessage (msg );
309- }
310- }
311-
312- /**
313- * Helper method to send runnable into local handler loop
314- *
315- * @param runnable runnable instance, can be null
316- */
317- protected void postRunnable (Runnable runnable ) {
318- if (runnable != null ) {
319- handler .post (runnable );
320- }
321- }
322-
323- /**
324- * Helper method to create Message instance from handler
325- *
326- * @param responseMessageId constant to identify Handler message
327- * @param responseMessageData object to be passed to message receiver
328- * @return Message instance, should not be null
329- */
330- protected Message obtainMessage (int responseMessageId , Object responseMessageData ) {
331- Message msg ;
332- if (handler != null ) {
333- msg = handler .obtainMessage (responseMessageId , responseMessageData );
334- } else {
335- msg = Message .obtain ();
336- if (msg != null ) {
337- msg .what = responseMessageId ;
338- msg .obj = responseMessageData ;
339- }
340- }
341- return msg ;
342- }
343-
344- @ Override
345- public void sendResponseMessage (HttpResponse response ) throws IOException {
346- // do not process if request has been cancelled
347- if (!Thread .currentThread ().isInterrupted ()) {
348- StatusLine status = response .getStatusLine ();
349- byte [] responseBody ;
350- responseBody = getResponseData (response .getEntity ());
351- // additional cancellation check as getResponseData() can take non-zero time to process
352- if (!Thread .currentThread ().isInterrupted ()) {
353- if (status .getStatusCode () >= 300 ) {
354- sendFailureMessage (status .getStatusCode (), response .getAllHeaders (), responseBody , new HttpResponseException (status .getStatusCode (), status .getReasonPhrase ()));
355- } else {
356- sendSuccessMessage (status .getStatusCode (), response .getAllHeaders (), responseBody );
357- }
358- }
35975 }
36076 }
36177
@@ -366,7 +82,9 @@ public void sendResponseMessage(HttpResponse response) throws IOException {
36682 * @return response entity body or null
36783 * @throws java.io.IOException if reading entity or creating byte array failed
36884 */
85+ @ Override
36986 byte [] getResponseData (HttpEntity entity ) throws IOException {
87+
37088 byte [] responseBody = null ;
37189 if (entity != null ) {
37290 InputStream instream = entity .getContent ();
0 commit comments