我有一个带有@Module
带注释方法的Dagger2 @Provides
类调用Retrofit.create
方法:
@Provides
RestService provideRestService(final Retrofit retrofit) {
return retrofit.create(RestService.class);
}
我应该使用@Singleton
注释注释此方法吗?
我认为有一个理由这样做:每次调用create
都有一些费用以及不这样做的一个原因:保持一个实例有一些成本 (每次请求实例时,Dagger都会执行双重检查。)
首选哪种解决方案?是否有@Singleton
注释?或者它可能根本不重要?或者我在提供程序中创建此类的方法从根本上是错误的?
答案 0 :(得分:2)
如果允许其他实例但可能很昂贵,您也可以考虑使用@Reusable
。您失去了双重检查锁定,但您(可能)缩短了对象的寿命并获得了安装实例的灵活性。
当你想限制一个类型的条款数量时,
@Reusable
很有用,但是没有特定的生命周期,只有一个实例。
请参阅the User's Guide topic或SO问题Dagger @Reusable scope vs @Singleton。
答案 1 :(得分:0)
是的,你应该。你避免内存分配。 Android将保持相同的实例,直到应用程序被杀死。考虑一下你是否将api称为for循环,并且每次创建一个新实例(不推荐,并且在相同的注入时使用dagger时不会发生,但就像一个例子)。它会扼杀你的记忆。所以你应该使用webPreferences.webSecurity
。
Singleton将确保您将在模块中使用相同的实例。