Skip to content

Commit 8507b5d

Browse files
committed
Merge pull request square#1065 from edenman/master
Fix memory leak: cancel deferred request if another is requested
2 parents d350582 + 94ff865 commit 8507b5d

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

picasso/src/main/java/com/squareup/picasso/Picasso.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,10 @@ Request transformRequest(Request request) {
477477
}
478478

479479
void defer(ImageView view, DeferredRequestCreator request) {
480+
// If there is already a deferred request, cancel it.
481+
if (targetToDeferredRequestCreator.containsKey(view)) {
482+
cancelExistingRequest(view);
483+
}
480484
targetToDeferredRequestCreator.put(view, request);
481485
}
482486

picasso/src/test/java/com/squareup/picasso/PicassoTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,18 @@ public class PicassoTest {
235235
assertThat(picasso.targetToDeferredRequestCreator).isEmpty();
236236
}
237237

238+
@Test public void enqueueingDeferredRequestCancelsThePreviousOne() throws Exception {
239+
ImageView target = mockImageViewTarget();
240+
DeferredRequestCreator firstRequestCreator = mockDeferredRequestCreator();
241+
picasso.defer(target, firstRequestCreator);
242+
assertThat(picasso.targetToDeferredRequestCreator).containsKey(target);
243+
244+
DeferredRequestCreator secondRequestCreator = mockDeferredRequestCreator();
245+
picasso.defer(target, secondRequestCreator);
246+
verify(firstRequestCreator).cancel();
247+
assertThat(picasso.targetToDeferredRequestCreator).containsKey(target);
248+
}
249+
238250
@Test public void cancelExistingRequestWithTarget() {
239251
Target target = mockTarget();
240252
Action action = mockAction(URI_KEY_1, URI_1, target);

0 commit comments

Comments
 (0)