【问题标题】:Should @Provides annotated method for Retrofit class be annotated with @SingletonRetrofit 类的 @Provides 注释方法是否应该使用 @Singleton 注释
【发布时间】:2018-01-02 17:19:41
【问题描述】:

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

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

我应该用@Singleton 注释来注释这个方法吗?

我看到了这样做的一个原因:每次调用 create 都会有一定的成本,而不这样做的原因有一个:保留一个实例有一定的成本(Dagger每次请求实例时执行双重检查)。

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

【问题讨论】:

  • 这似乎是进行一些性能测试并与社区分享结果的好机会,您不觉得吗?
  • @Pelocho 是的,这是个好主意!

标签: android retrofit dagger-2 dagger


【解决方案1】:

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

@Reusable 在您想限制一种类型的规定数量时很有用,但没有特定的生命周期必须只有一个实例。

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

【讨论】:

    【解决方案2】:

    是的,你应该这样做。您避免了内存分配。 Android 将让您保持相同的实例,直到应用程序被终止。考虑一下是否将 api like 调用到 for 循环中,并且每次创建新实例时(不推荐,并且在同一注入中使用 dagger 时不会发生,但就像一个示例一样)。它会杀死你的记忆。所以你应该使用@Singleton

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2023-04-08
      • 2015-10-03
      • 1970-01-01
      相关资源
      最近更新 更多