Skip to content

Commit 9349b47

Browse files
committed
Retry requests, safer serializable cookies, better request params and smarter jsonresponse
1 parent b95db79 commit 9349b47

File tree

7 files changed

+44
-37
lines changed

7 files changed

+44
-37
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Features
88
* Make asynchronous HTTP requests, handle responses in callbacks
99
* HTTP requests do not happen in the android UI thread
1010
* Requests use a threadpool to cap concurrent resource usage
11+
* Retry requests to help with bad connectivity
1112
* GET/POST params builder (RequestParams)
1213
* Optional built-in response parsing into JSON (JsonHttpResponseHandler)
1314
* Optional persistent cookie store, saves cookies into your app's SharedPreferences

examples/TwitterRestClientUsage.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ class TwitterRestClientUsage {
55
public void getPublicTimeline() {
66
TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() {
77
@Override
8-
public void onSuccess(Object response) {
9-
JSONArray timeline = (JSONArray)response;
10-
8+
public void onSuccess(JSONArray timeline) {
119
try {
1210
JSONObject firstEvent = (JSONObject)timeline.get(0);
1311
String tweetText = firstEvent.getString("text");

src/com/loopj/android/http/AsyncHttpClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ public AsyncHttpClient(String userAgent) {
8787
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
8888
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(httpParams, schemeRegistry);
8989

90-
threadPool = Executors.newCachedThreadPool();
9190
httpContext = new SyncBasicHttpContext(new BasicHttpContext());
9291
httpClient = new DefaultHttpClient(cm, httpParams);
9392
httpClient.addRequestInterceptor(new HttpRequestInterceptor() {
@@ -114,6 +113,8 @@ public void process(HttpResponse response, HttpContext context) {
114113
});
115114

116115
httpClient.setHttpRequestRetryHandler(new RetryHandler(DEFAULT_MAX_RETRIES));
116+
117+
threadPool = Executors.newCachedThreadPool();
117118
}
118119

119120
public void setCookieStore(CookieStore cookieStore) {

src/com/loopj/android/http/AsyncHttpResponseHandler.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,16 @@ public void sendFinishMessage() {
5050
}
5151

5252
public void sendResponseMessage(HttpResponse response) {
53-
sendMessage(obtainMessage(RESPONSE_MESSAGE, response));
53+
StatusLine status = response.getStatusLine();
54+
if(status.getStatusCode() >= 300) {
55+
sendErrorMessage(new HttpResponseException(status.getStatusCode(), status.getReasonPhrase()));
56+
} else {
57+
try {
58+
sendMessage(obtainMessage(RESPONSE_MESSAGE, getResponseBody(response)));
59+
} catch(IOException e) {
60+
sendErrorMessage(e);
61+
}
62+
}
5463
}
5564

5665
public void sendErrorMessage(Throwable e) {
@@ -61,7 +70,7 @@ public void sendErrorMessage(Throwable e) {
6170
public void handleMessage(Message msg) {
6271
switch(msg.what) {
6372
case RESPONSE_MESSAGE:
64-
handleResponseMessage((HttpResponse)msg.obj);
73+
handleResponseMessage((String)msg.obj);
6574
break;
6675
case ERROR_MESSAGE:
6776
handleErrorMessage((Throwable)msg.obj);
@@ -75,17 +84,8 @@ public void handleMessage(Message msg) {
7584
}
7685
}
7786

78-
protected void handleResponseMessage(HttpResponse response) {
79-
StatusLine status = response.getStatusLine();
80-
if(status.getStatusCode() >= 300) {
81-
onFailure(new HttpResponseException(status.getStatusCode(), status.getReasonPhrase()));
82-
} else {
83-
try {
84-
onSuccess(getResponseBody(response));
85-
} catch(IOException e) {
86-
onFailure(e);
87-
}
88-
}
87+
protected void handleResponseMessage(String responseBody) {
88+
onSuccess(responseBody);
8989
}
9090

9191
protected void handleErrorMessage(Throwable e) {

src/com/loopj/android/http/JsonHttpResponseHandler.java

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,29 @@
2020

2121
import java.io.IOException;
2222

23+
import org.json.JSONArray;
2324
import org.json.JSONException;
25+
import org.json.JSONObject;
2426
import org.json.JSONTokener;
2527

26-
import org.apache.http.HttpResponse;
27-
import org.apache.http.StatusLine;
28-
import org.apache.http.client.HttpResponseException;
29-
3028
public class JsonHttpResponseHandler extends AsyncHttpResponseHandler {
31-
protected void handleResponseMessage(HttpResponse response) {
32-
StatusLine status = response.getStatusLine();
33-
if(status.getStatusCode() >= 300) {
34-
onFailure(new HttpResponseException(status.getStatusCode(), status.getReasonPhrase()));
35-
} else {
36-
try {
37-
String responseBody = getResponseBody(response);
38-
onSuccess(responseBody);
39-
40-
Object jsonResponse = new JSONTokener(responseBody).nextValue();
41-
onSuccess(jsonResponse);
42-
} catch(JSONException e) {
43-
onFailure(e);
44-
} catch(IOException e) {
45-
onFailure(e);
29+
@Override
30+
protected void handleResponseMessage(String responseBody) {
31+
super.handleResponseMessage(responseBody);
32+
33+
try {
34+
Object jsonResponse = new JSONTokener(responseBody).nextValue();
35+
if(jsonResponse instanceof JSONObject) {
36+
onSuccess((JSONObject)jsonResponse);
37+
} else if(jsonResponse instanceof JSONArray) {
38+
onSuccess((JSONArray)jsonResponse);
4639
}
40+
} catch(JSONException e) {
41+
onFailure(e);
4742
}
4843
}
4944

5045
// Public callbacks
51-
public void onSuccess(Object response) {}
46+
public void onSuccess(JSONObject response) {}
47+
public void onSuccess(JSONArray response) {}
5248
}

src/com/loopj/android/http/RequestParams.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.UnsupportedEncodingException;
2222
import java.util.LinkedList;
2323
import java.util.List;
24+
import java.util.Map;
2425
import java.util.concurrent.ConcurrentHashMap;
2526

2627
import org.apache.http.HttpEntity;
@@ -37,6 +38,14 @@ public RequestParams() {
3738
init();
3839
}
3940

41+
public RequestParams(Map<String, String> source) {
42+
init();
43+
44+
for(Map.Entry<String, String> entry : source.entrySet()) {
45+
put(entry.getKey(), entry.getValue());
46+
}
47+
}
48+
4049
public RequestParams(String key, String value) {
4150
init();
4251
put(key, value);

src/com/loopj/android/http/SerializableCookie.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.apache.http.impl.cookie.BasicClientCookie;
2929

3030
public class SerializableCookie implements Serializable {
31+
private static final long serialVersionUID = 6374381828722046732L;
32+
3133
private transient Cookie cookie;
3234
private transient BasicClientCookie clientCookie;
3335

0 commit comments

Comments
 (0)