Skip to content

Commit 5872e97

Browse files
committed
Track requests by context, to allow cancellation in onDestroy
1 parent 9e1d6d0 commit 5872e97

File tree

2 files changed

+72
-20
lines changed

2 files changed

+72
-20
lines changed

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

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,13 @@
2020

2121
import java.io.IOException;
2222
import java.io.InputStream;
23-
import java.util.concurrent.Executor;
24-
import java.util.concurrent.ExecutorService;
23+
import java.util.List;
24+
import java.util.LinkedList;
25+
import java.util.Map;
26+
import java.util.WeakHashMap;
2527
import java.util.concurrent.Executors;
28+
import java.util.concurrent.Future;
29+
import java.util.concurrent.ThreadPoolExecutor;
2630
import java.util.zip.GZIPInputStream;
2731

2832
import org.apache.http.Header;
@@ -37,6 +41,7 @@
3741
import org.apache.http.client.methods.HttpGet;
3842
import org.apache.http.client.methods.HttpPost;
3943
import org.apache.http.client.methods.HttpRequestBase;
44+
import org.apache.http.client.methods.HttpUriRequest;
4045
import org.apache.http.client.protocol.ClientContext;
4146
import org.apache.http.conn.params.ConnManagerParams;
4247
import org.apache.http.conn.params.ConnPerRouteBean;
@@ -54,9 +59,12 @@
5459
import org.apache.http.protocol.SyncBasicHttpContext;
5560
import org.apache.http.protocol.HttpContext;
5661

62+
import android.content.Context;
63+
import android.util.Log;
64+
5765
public class AsyncHttpClient {
5866
public static final int DEFAULT_MAX_CONNECTIONS = 10;
59-
public static final int DEFAULT_SOCKET_TIMEOUT = 30 * 1000;
67+
public static final int DEFAULT_SOCKET_TIMEOUT = 10 * 1000;
6068
public static final int DEFAULT_MAX_RETRIES = 5;
6169
private static final String ENCODING = "UTF-8";
6270
private static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding";
@@ -67,7 +75,8 @@ public class AsyncHttpClient {
6775

6876
private DefaultHttpClient httpClient;
6977
private HttpContext httpContext;
70-
private Executor threadPool;
78+
private ThreadPoolExecutor threadPool;
79+
private Map<Context, List<Future>> requestMap;
7180

7281
public AsyncHttpClient(String userAgent) {
7382
BasicHttpParams httpParams = new BasicHttpParams();
@@ -114,37 +123,55 @@ public void process(HttpResponse response, HttpContext context) {
114123

115124
httpClient.setHttpRequestRetryHandler(new RetryHandler(DEFAULT_MAX_RETRIES));
116125

117-
threadPool = Executors.newCachedThreadPool();
126+
threadPool = (ThreadPoolExecutor)Executors.newCachedThreadPool();
127+
128+
requestMap = new WeakHashMap<Context, List<Future>>();
118129
}
119130

120131
public void setCookieStore(CookieStore cookieStore) {
121132
httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
122133
}
123134

124-
public void setThreadPool(Executor threadPool) {
135+
public void setThreadPool(ThreadPoolExecutor threadPool) {
125136
this.threadPool = threadPool;
126137
}
127138

128139
public void get(String url, AsyncHttpResponseHandler responseHandler) {
129-
get(url, null, responseHandler);
140+
get(null, url, null, responseHandler);
141+
}
142+
143+
public void get(Context context, String url, AsyncHttpResponseHandler responseHandler) {
144+
get(context, url, null, responseHandler);
130145
}
131146

132147
public void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
148+
get(null, url, params, responseHandler);
149+
}
150+
151+
public void get(Context context, String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
133152
// Build and append query string (utf8 url encoded)
134153
if(params != null) {
135154
String paramString = params.getParamString();
136155
url += "?" + paramString;
137156
}
138157

139158
// Fire up the request in a new thread
140-
threadPool.execute(new AsyncHttpRequest(httpClient, httpContext, new HttpGet(url), responseHandler));
159+
sendRequest(httpClient, httpContext, new HttpGet(url), responseHandler, context);
141160
}
142161

143162
public void post(String url, AsyncHttpResponseHandler responseHandler) {
144-
post(url, null, responseHandler);
163+
post(null, url, null, responseHandler);
164+
}
165+
166+
public void post(Context context, String url, AsyncHttpResponseHandler responseHandler) {
167+
post(context, url, null, responseHandler);
145168
}
146169

147170
public void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
171+
post(null, url, params, responseHandler);
172+
}
173+
174+
public void post(Context context, String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
148175
// Build post object with params
149176
final HttpPost post = new HttpPost(url);
150177
if(params != null) {
@@ -155,7 +182,31 @@ public void post(String url, RequestParams params, AsyncHttpResponseHandler resp
155182
}
156183

157184
// Fire up the request in a new thread
158-
threadPool.execute(new AsyncHttpRequest(httpClient, httpContext, post, responseHandler));
185+
sendRequest(httpClient, httpContext, post, responseHandler, context);
186+
}
187+
188+
public void cancelRequests(Context context, boolean mayInterruptIfRunning) {
189+
List<Future> requestList = requestMap.get(context);
190+
if(requestList != null) {
191+
for(Future request : requestList) {
192+
request.cancel(mayInterruptIfRunning);
193+
}
194+
}
195+
requestMap.remove(context);
196+
}
197+
198+
private void sendRequest(DefaultHttpClient client, HttpContext httpContext, HttpUriRequest uriRequest, AsyncHttpResponseHandler responseHandler, Context context) {
199+
Future request = threadPool.submit(new AsyncHttpRequest(client, httpContext, uriRequest, responseHandler));
200+
201+
if(context != null) {
202+
List<Future> requestList = requestMap.get(context);
203+
if(requestList == null) {
204+
requestList = new LinkedList<Future>();
205+
requestMap.put(context, requestList);
206+
}
207+
208+
requestList.add(request);
209+
}
159210
}
160211

161212
private static class InflatingEntity extends HttpEntityWrapper {

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,6 @@ protected void handleMessage(Message msg) {
110110
}
111111
}
112112

113-
protected String getResponseBody(HttpResponse response) throws IOException {
114-
HttpEntity entity = null;
115-
HttpEntity temp = response.getEntity();
116-
if(temp != null) {
117-
entity = new BufferedHttpEntity(temp);
118-
}
119-
120-
return EntityUtils.toString(entity);
121-
}
122-
123113
protected void sendMessage(Message msg) {
124114
if(handler != null){
125115
handler.sendMessage(msg);
@@ -140,6 +130,17 @@ protected Message obtainMessage(int responseMessage, Object response) {
140130
return msg;
141131
}
142132

133+
protected String getResponseBody(HttpResponse response) throws IOException {
134+
HttpEntity entity = null;
135+
HttpEntity temp = response.getEntity();
136+
if(temp != null) {
137+
entity = new BufferedHttpEntity(temp);
138+
}
139+
140+
return EntityUtils.toString(entity);
141+
}
142+
143+
143144
// Public callbacks
144145
public void onStart() {}
145146
public void onFinish() {}

0 commit comments

Comments
 (0)