aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/android/volley/toolbox
diff options
context:
space:
mode:
authorAnonymous <no-reply@google.com>2017-10-09 10:53:24 -0700
committerJeff Davidson <jpd@google.com>2017-10-11 12:28:08 -0700
commit82e4a43fe78d4f665985b4e4726ff2baee449fe8 (patch)
tree19e615b27d9cb80945f86cadc0a7ccca09cc1dee /src/main/java/com/android/volley/toolbox
parent2021ca6a6c3fa80646220cb97746f0b1cd3ae103 (diff)
downloadvolley-82e4a43fe78d4f665985b4e4726ff2baee449fe8.tar.gz
Import of Volley from GitHub to AOSP.
- 95f64de9bfa2ee44d6cf93a6dc4b980e5ec56f6a Fix leak of callbacks on canceled requests. by Jeff Davidson <jpd236@cornell.edu> GitOrigin-RevId: 95f64de9bfa2ee44d6cf93a6dc4b980e5ec56f6a Change-Id: I9537a9937f9c0e7078dfa8f8fdfcd8deb36417a7
Diffstat (limited to 'src/main/java/com/android/volley/toolbox')
-rw-r--r--src/main/java/com/android/volley/toolbox/ImageRequest.java22
-rw-r--r--src/main/java/com/android/volley/toolbox/JsonRequest.java22
-rw-r--r--src/main/java/com/android/volley/toolbox/StringRequest.java23
3 files changed, 58 insertions, 9 deletions
diff --git a/src/main/java/com/android/volley/toolbox/ImageRequest.java b/src/main/java/com/android/volley/toolbox/ImageRequest.java
index 0f33cd8..1db7e35 100644
--- a/src/main/java/com/android/volley/toolbox/ImageRequest.java
+++ b/src/main/java/com/android/volley/toolbox/ImageRequest.java
@@ -42,7 +42,11 @@ public class ImageRequest extends Request<Bitmap> {
/** Default backoff multiplier for image requests */
public static final float DEFAULT_IMAGE_BACKOFF_MULT = 2f;
- private final Response.Listener<Bitmap> mListener;
+ /** Lock to guard mListener as it is cleared on cancel() and read on delivery. */
+ private final Object mLock = new Object();
+
+ // @GuardedBy("mLock")
+ private Response.Listener<Bitmap> mListener;
private final Config mDecodeConfig;
private final int mMaxWidth;
private final int mMaxHeight;
@@ -215,9 +219,21 @@ public class ImageRequest extends Request<Bitmap> {
}
@Override
+ public void cancel() {
+ super.cancel();
+ synchronized (mLock) {
+ mListener = null;
+ }
+ }
+
+ @Override
protected void deliverResponse(Bitmap response) {
- if (mListener != null) {
- mListener.onResponse(response);
+ Response.Listener<Bitmap> listener;
+ synchronized (mLock) {
+ listener = mListener;
+ }
+ if (listener != null) {
+ listener.onResponse(response);
}
}
diff --git a/src/main/java/com/android/volley/toolbox/JsonRequest.java b/src/main/java/com/android/volley/toolbox/JsonRequest.java
index 40877b1..f291076 100644
--- a/src/main/java/com/android/volley/toolbox/JsonRequest.java
+++ b/src/main/java/com/android/volley/toolbox/JsonRequest.java
@@ -39,7 +39,11 @@ public abstract class JsonRequest<T> extends Request<T> {
private static final String PROTOCOL_CONTENT_TYPE =
String.format("application/json; charset=%s", PROTOCOL_CHARSET);
- private final Listener<T> mListener;
+ /** Lock to guard mListener as it is cleared on cancel() and read on delivery. */
+ private final Object mLock = new Object();
+
+ // @GuardedBy("mLock")
+ private Listener<T> mListener;
private final String mRequestBody;
/**
@@ -62,9 +66,21 @@ public abstract class JsonRequest<T> extends Request<T> {
}
@Override
+ public void cancel() {
+ super.cancel();
+ synchronized (mLock) {
+ mListener = null;
+ }
+ }
+
+ @Override
protected void deliverResponse(T response) {
- if (mListener != null) {
- mListener.onResponse(response);
+ Response.Listener<T> listener;
+ synchronized (mLock) {
+ listener = mListener;
+ }
+ if (listener != null) {
+ listener.onResponse(response);
}
}
diff --git a/src/main/java/com/android/volley/toolbox/StringRequest.java b/src/main/java/com/android/volley/toolbox/StringRequest.java
index 05a62f6..9deba1d 100644
--- a/src/main/java/com/android/volley/toolbox/StringRequest.java
+++ b/src/main/java/com/android/volley/toolbox/StringRequest.java
@@ -28,7 +28,12 @@ import java.io.UnsupportedEncodingException;
* A canned request for retrieving the response body at a given URL as a String.
*/
public class StringRequest extends Request<String> {
- private final Listener<String> mListener;
+
+ /** Lock to guard mListener as it is cleared on cancel() and read on delivery. */
+ private final Object mLock = new Object();
+
+ // @GuardedBy("mLock")
+ private Listener<String> mListener;
/**
* Creates a new request with the given method.
@@ -56,9 +61,21 @@ public class StringRequest extends Request<String> {
}
@Override
+ public void cancel() {
+ super.cancel();
+ synchronized (mLock) {
+ mListener = null;
+ }
+ }
+
+ @Override
protected void deliverResponse(String response) {
- if (mListener != null) {
- mListener.onResponse(response);
+ Response.Listener<String> listener;
+ synchronized (mLock) {
+ listener = mListener;
+ }
+ if (listener != null) {
+ listener.onResponse(response);
}
}