From f117d6b9b819d82a2e7ddf05e2e9342d48f329cf Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Mon, 16 Nov 2015 17:34:53 -0500 Subject: [PATCH] Cache stateless built-in converter instances. --- .../main/java/retrofit/BuiltInConverters.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/retrofit/src/main/java/retrofit/BuiltInConverters.java b/retrofit/src/main/java/retrofit/BuiltInConverters.java index be2f81d5..bba8f28f 100644 --- a/retrofit/src/main/java/retrofit/BuiltInConverters.java +++ b/retrofit/src/main/java/retrofit/BuiltInConverters.java @@ -25,21 +25,40 @@ import retrofit.http.Streaming; import static retrofit.Utils.closeQuietly; final class BuiltInConverters extends Converter.Factory { + private OkHttpResponseBodyConverter streamingResponseBodyConverter; + private OkHttpResponseBodyConverter bufferingResponseBodyConverter; + private VoidConverter voidResponseBodyConverter; + private OkHttpRequestBodyConverter requestBodyConverter; + @Override public Converter fromResponseBody(Type type, Annotation[] annotations) { - if (ResponseBody.class.equals(type)) { - boolean isStreaming = Utils.isAnnotationPresent(annotations, Streaming.class); - return new OkHttpResponseBodyConverter(isStreaming); + if (ResponseBody.class == type) { + if (Utils.isAnnotationPresent(annotations, Streaming.class)) { + OkHttpResponseBodyConverter converter = streamingResponseBodyConverter; + return converter != null + ? converter + : (streamingResponseBodyConverter = new OkHttpResponseBodyConverter(true)); + } else { + OkHttpResponseBodyConverter converter = bufferingResponseBodyConverter; + return converter != null + ? converter + : (bufferingResponseBodyConverter = new OkHttpResponseBodyConverter(false)); + } } - if (Void.class.equals(type)) { - return new VoidConverter(); + if (Void.class == type) { + VoidConverter converter = voidResponseBodyConverter; + return converter != null + ? converter + : (voidResponseBodyConverter = new VoidConverter()); } return null; } @Override public Converter toRequestBody(Type type, Annotation[] annotations) { - if (type instanceof Class && RequestBody.class.isAssignableFrom((Class) type)) { - return new OkHttpRequestBodyConverter(); + if (RequestBody.class.isAssignableFrom(Utils.getRawType(type))) { + return requestBodyConverter != null + ? requestBodyConverter + : (requestBodyConverter = new OkHttpRequestBodyConverter()); } return null; } -- GitLab