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