【问题标题】:Retrofit + Dagger + Timeouts改造+匕首+超时
【发布时间】:2016-05-19 09:29:45
【问题描述】:

我知道最好使用单例模式来改造对象。我通常会重用服务接口对象而不是改造。

@Provides
@Singleton
RestAPIService providesRestAPIService(Retrofit retrofit) {
    return retrofit.create(RestAPIService.class);
}

但是,现在我的项目中有一个要求,我对每个不同的端点都有不同的 KPI(提交 API 使用 40 秒读取超时,而检索 API 使用 10 秒,验证 API 使用 20 秒读取超时)。

那么在多重差异读取超时场景中使用 DI 的正确方法是什么?我应该创建多个 Okhttp 实例还是多个 Retrofit 实例或多个 API 实例?

【问题讨论】:

  • 而不是直接设置值,您可以创建一个类,并在该类中为超时定义一个初始值并为其创建一个 getter 和 setter,并通过此 getter 设置超时,当您需要更改超时设置其他超时彻底设置器
  • 使用工厂,为不同的 kpi 创建单独的 okhttp 实例。使用单例的风险太大,因为一个线程可能使用具有一个超时值的所述单例,而另一个线程使用不同的超时值。

标签: android retrofit okhttp dagger


【解决方案1】:

您可以使用 Dagger2 使用 @Named 注释创建多个 Retrofit 实例。您可以相应地更改 readtimeout、writetimeout。

@Provides
@Named("myapi1retrofit")
Retrofit provideRetro() {
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.connectTimeout(2, TimeUnit.MINUTES)
                .writeTimeout(2, TimeUnit.MINUTES)
                .readTimeout(2, TimeUnit.MINUTES);
   return new Retrofit.Builder()
                .client(httpClient.build())
                .baseUrl("http://api1.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
}

@Provides
@Named("myapi2retrofit")
Retrofit provideRetro() {
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.connectTimeout(2, TimeUnit.MINUTES)
                .writeTimeout(1, TimeUnit.MINUTES)
                .readTimeout(1, TimeUnit.MINUTES);
   return new Retrofit.Builder()
                .client(httpClient.build())
                .baseUrl("http://api2.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
}


@Provides
@Named("myapi1service")
public RestAPIService providesRestService(@Named("myapi1retrofit") Retrofit retrofit) {
return retrofit.create(RestAPIService.class);
}


@Provides
@Named("myapi1service")
public RestAPIService providesRestService(@Named("myapi2retrofit") Retrofit retrofit) {
return retrofit.create(RestAPIService.class);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多