我应该使用一个全局Retrofit实例,还是为Android中的每个请求创建一个?

时间:2016-08-08 13:19:11

标签: java android retrofit2 okhttp3

好吧,我现在迷失了使用Retrofit ......首先我写了一个Singleton帮助器类,它包含一个由Retrofit实例创建的服务实例。获取服务并发出HTTP请求非常方便,但后来发现我无法从SharedPreferences获取访问令牌,因为帮助程序实例是静态的。因为我使用Authenticator接口来处理身份验证,所以在发出请求时无法传递访问令牌。我尝试扩展Application类并在静态字段中保存Application实例,但Android Studio会给我一个警告(Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run))。

所以现在我有另一种选择:编写一个静态助手方法,对于每个请求,接受访问令牌,构建一个Retrofit实例,创建一个服务实例并发出请求。现在我很困惑,这是否是最好的做法。重用一个服务实例和为每个请求创建服务之间的区别是什么?

PS:上面的service一词指的是由someRetrofit.create(someServiceInterface.class)创建的服务实例,而不是android.app.Service

1 个答案:

答案 0 :(得分:-1)

我还建议你继续使用Singleton方法,因为它的设计前景也很好。

如果您创建多个服务实例,则每个实例都可能具有不同的网络属性,如readTimeout,writeTimeout,响应日志记录属性等,或者您必须将它们全部设置为一个属性,如果我们在团队中工作,这可能会给出你很头疼。

我遇到的一个用户案例是,在稍后的某个时间点你的后端团队在你的每个请求(如设备操作系统版本)的附加标题参数上然后你必须将这个属性添加到所有改造客户端,这将是痛苦

以下是我的代码片段,我如何处理标题。

public static Retrofit getRestAdapter(final HashMap<String, String> requestHeaderMap) {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
            .addNetworkInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request.Builder builder = chain.request().newBuilder();
                    Set<Map.Entry<String, String>> entrySet = requestHeaderMap.entrySet();
                    for (Map.Entry<String, String> entry : entrySet) {
                        if (entry.getValue().isEmpty())
                            builder.removeHeader(entry.getKey());
                        else
                            builder.addHeader(entry.getKey(), entry.getValue());
                    }

                    Request request = builder.build();
                    return chain.proceed(request);
                }


            }).build();

    return new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

并且requestHeaderMap的实例是全局实例,并且使用可观察模式将数据推入其中。

我希望这可以帮助你做出决定。