Skip to content

Commit dbe9d9e

Browse files
committed
Notify exception listener rather than crash when no available handlers.
1 parent 8de337b commit dbe9d9e

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ class BitmapHunter implements Runnable {
5454

5555
private static final AtomicInteger SEQUENCE_GENERATOR = new AtomicInteger();
5656

57+
private static final RequestHandler ERRORING_HANDLER = new RequestHandler() {
58+
@Override public boolean canHandleRequest(Request data) {
59+
return true;
60+
}
61+
62+
@Override public Result load(Request data) throws IOException {
63+
throw new IllegalStateException("Unrecognized type of request: " + data);
64+
}
65+
};
66+
5767
final int sequence;
5868
final Picasso picasso;
5969
final Dispatcher dispatcher;
@@ -331,17 +341,18 @@ static void updateThreadName(Request data) {
331341
static BitmapHunter forRequest(Picasso picasso, Dispatcher dispatcher,
332342
Cache cache, Stats stats, Action action) {
333343
Request request = action.getRequest();
334-
335344
List<RequestHandler> requestHandlers = picasso.getRequestHandlers();
336-
final int count = requestHandlers.size();
337-
for (int i = 0; i < count; i++) {
345+
346+
// Index-based loop to avoid allocating an iterator.
347+
//noinspection ForLoopReplaceableByForEach
348+
for (int i = 0, count = requestHandlers.size(); i < count; i++) {
338349
RequestHandler requestHandler = requestHandlers.get(i);
339350
if (requestHandler.canHandleRequest(request)) {
340351
return new BitmapHunter(picasso, dispatcher, cache, stats, action, requestHandler);
341352
}
342353
}
343354

344-
throw new IllegalStateException("Unrecognized type of request: " + request);
355+
return new BitmapHunter(picasso, dispatcher, cache, stats, action, ERRORING_HANDLER);
345356
}
346357

347358
static Bitmap applyCustomTransformations(List<Transformation> transformations, Bitmap result) {

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,11 @@ public enum Priority {
162162
this.listener = listener;
163163
this.requestTransformer = requestTransformer;
164164

165-
final int extraCount = (extraRequestHandlers != null ? extraRequestHandlers.size() : 0);
166-
final List<RequestHandler> allRequestHandlers = new ArrayList<RequestHandler>(7 + extraCount);
165+
int builtInHandlers = 7; // Adjust this as internal handlers are added or removed.
166+
int extraCount = (extraRequestHandlers != null ? extraRequestHandlers.size() : 0);
167+
List<RequestHandler> allRequestHandlers =
168+
new ArrayList<RequestHandler>(builtInHandlers + extraCount);
169+
167170
// ResourceRequestHandler needs to be the first in the list to avoid
168171
// forcing other RequestHandlers to perform null checks on request.uri
169172
// to cover the (request.resourceId != 0) case.

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
import static com.squareup.picasso.BitmapHunter.forRequest;
3838
import static com.squareup.picasso.BitmapHunter.transformResult;
3939
import static com.squareup.picasso.Picasso.LoadedFrom.MEMORY;
40-
import static com.squareup.picasso.Picasso.Priority.LOW;
4140
import static com.squareup.picasso.Picasso.Priority.HIGH;
41+
import static com.squareup.picasso.Picasso.Priority.LOW;
4242
import static com.squareup.picasso.Picasso.Priority.NORMAL;
4343
import static com.squareup.picasso.TestUtils.ASSET_KEY_1;
4444
import static com.squareup.picasso.TestUtils.ASSET_URI_1;
@@ -47,6 +47,8 @@
4747
import static com.squareup.picasso.TestUtils.CONTACT_URI_1;
4848
import static com.squareup.picasso.TestUtils.CONTENT_1_URL;
4949
import static com.squareup.picasso.TestUtils.CONTENT_KEY_1;
50+
import static com.squareup.picasso.TestUtils.CUSTOM_URI;
51+
import static com.squareup.picasso.TestUtils.CUSTOM_URI_KEY;
5052
import static com.squareup.picasso.TestUtils.FILE_1_URL;
5153
import static com.squareup.picasso.TestUtils.FILE_KEY_1;
5254
import static com.squareup.picasso.TestUtils.MEDIA_STORE_CONTENT_1_URL;
@@ -59,10 +61,7 @@
5961
import static com.squareup.picasso.TestUtils.RESOURCE_TYPE_URI_KEY;
6062
import static com.squareup.picasso.TestUtils.URI_1;
6163
import static com.squareup.picasso.TestUtils.URI_KEY_1;
62-
import static com.squareup.picasso.TestUtils.CUSTOM_URI;
63-
import static com.squareup.picasso.TestUtils.CUSTOM_URI_KEY;
6464
import static com.squareup.picasso.TestUtils.mockAction;
65-
import static com.squareup.picasso.TestUtils.mockHunter;
6665
import static com.squareup.picasso.TestUtils.mockImageViewTarget;
6766
import static com.squareup.picasso.TestUtils.mockPicasso;
6867
import static org.fest.assertions.api.ANDROID.assertThat;
@@ -171,8 +170,9 @@ public class BitmapHunterTest {
171170

172171
@Test public void huntUnrecognizedUri() throws Exception {
173172
Action action = mockAction(CUSTOM_URI_KEY, CUSTOM_URI);
173+
BitmapHunter hunder = forRequest(picasso, dispatcher, cache, stats, action);
174174
try {
175-
forRequest(picasso, dispatcher, cache, stats, action);
175+
hunder.hunt();
176176
fail("Unrecognized URI should throw exception.");
177177
} catch (IllegalStateException expected) {
178178
}

0 commit comments

Comments
 (0)