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