Skip to content

Commit dbedb9d

Browse files
committed
Use weakreferences for request future tracking
1 parent b2dbf35 commit dbedb9d

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.LinkedList;
2525
import java.util.Map;
2626
import java.util.WeakHashMap;
27+
import java.lang.ref.WeakReference;
2728
import java.util.concurrent.Executors;
2829
import java.util.concurrent.Future;
2930
import java.util.concurrent.ThreadPoolExecutor;
@@ -76,7 +77,7 @@ public class AsyncHttpClient {
7677
private DefaultHttpClient httpClient;
7778
private HttpContext httpContext;
7879
private ThreadPoolExecutor threadPool;
79-
private Map<Context, List<Future>> requestMap;
80+
private Map<Context, List<WeakReference<Future>>> requestMap;
8081

8182
public AsyncHttpClient(String userAgent) {
8283
BasicHttpParams httpParams = new BasicHttpParams();
@@ -125,7 +126,7 @@ public void process(HttpResponse response, HttpContext context) {
125126

126127
threadPool = (ThreadPoolExecutor)Executors.newCachedThreadPool();
127128

128-
requestMap = new WeakHashMap<Context, List<Future>>();
129+
requestMap = new WeakHashMap<Context, List<WeakReference<Future>>>();
129130
}
130131

131132
public void setCookieStore(CookieStore cookieStore) {
@@ -186,10 +187,13 @@ public void post(Context context, String url, RequestParams params, AsyncHttpRes
186187
}
187188

188189
public void cancelRequests(Context context, boolean mayInterruptIfRunning) {
189-
List<Future> requestList = requestMap.get(context);
190+
List<WeakReference<Future>> requestList = requestMap.get(context);
190191
if(requestList != null) {
191-
for(Future request : requestList) {
192-
request.cancel(mayInterruptIfRunning);
192+
for(WeakReference<Future> requestRef : requestList) {
193+
Future request = requestRef.get();
194+
if(request != null) {
195+
request.cancel(mayInterruptIfRunning);
196+
}
193197
}
194198
}
195199
requestMap.remove(context);
@@ -199,13 +203,16 @@ private void sendRequest(DefaultHttpClient client, HttpContext httpContext, Http
199203
Future request = threadPool.submit(new AsyncHttpRequest(client, httpContext, uriRequest, responseHandler));
200204

201205
if(context != null) {
202-
List<Future> requestList = requestMap.get(context);
206+
// Add request to request map
207+
List<WeakReference<Future>> requestList = requestMap.get(context);
203208
if(requestList == null) {
204-
requestList = new LinkedList<Future>();
209+
requestList = new LinkedList<WeakReference<Future>>();
205210
requestMap.put(context, requestList);
206211
}
207212

208-
requestList.add(request);
213+
requestList.add(new WeakReference<Future>(request));
214+
215+
// TODO: Remove dead weakrefs from requestLists?
209216
}
210217
}
211218

0 commit comments

Comments
 (0)