是否应使用@Singleton注释@Provides Retrofit类的注释方法

时间:2018-01-02 17:19:41

标签: android retrofit dagger-2 dagger

我有一个带有@Module带注释方法的Dagger2 @Provides类调用Retrofit.create方法:

@Provides
RestService provideRestService(final Retrofit retrofit) {
    return retrofit.create(RestService.class);
}

我应该使用@Singleton注释注释此方法吗?

我认为有一个理由这样做:每次调用create都有一些费用以及不这样做的一个原因:保持一个实例有一些成本 (每次请求实例时,Dagger都会执行双重检查。)

首选哪种解决方案?是否有@Singleton注释?或者它可能根本不重要?或者我在提供程序中创建此类的方法从根本上是错误的?

2 个答案:

答案 0 :(得分:2)

如果允许其他实例但可能很昂贵,您也可以考虑使用@Reusable。您失去了双重检查锁定,但您(可能)缩短了对象的寿命并获得了安装实例的灵活性。

  当你想限制一个类型的条款数量时,

@Reusable很有用,但是没有特定的生命周期,只有一个实例。

请参阅the User's Guide topic或SO问题Dagger @Reusable scope vs @Singleton

答案 1 :(得分:0)

是的,你应该。你避免内存分配。 Android将保持相同的实例,直到应用程序被杀死。考虑一下你是否将api称为for循环,并且每次创建一个新实例(不推荐,并且在相同的注入时使用dagger时不会发生,但就像一个例子)。它会扼杀你的记忆。所以你应该使用webPreferences.webSecurity

Singleton将确保您将在模块中使用相同的实例。