Android: Dagger2のScopeについてあれこれ

More than 1 year has passed since last update.

結論: Application(Singleton), Activity, Fragment, Viewの4つのScopeを作るのが良いと思います.


Scopeとは?

とあるprovideするインスタンスの生存期間を指定するアノテーションです. SingletonアノテーションもScopeの一種です.

例えば, Singletonは, その名の表すとおり, Singletonで表現したいインスタンスに対してアノテートします.

Androidなら, OkHttpClientなどはSingletonで管理すべきなので, 下のように表現できます.

@Singleton @Provides public static OkHttpClient provideOkHttpClient() {

return new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.build();
}

Singletonアノテーションを付けないと, Injectするたびに新しいインスタンスが作られます.

また, ScopeアノテーションはDagger特有のアノテーションではなく, JSR-330で定義されているスペックなので,

Daggerが廃れたとしても, JSR-330が廃れてない限り使える知識, 技術になります.


Androidに適したScope

Androidには大きく, Application, Activity, Fragment, Viewの4つのライフサイクルがあります.

なので, それらに対してScopeを定義すればいいと思ってます.


  • Application: Singleton

  • Activity: ActivityScope

  • Fragment: FragmentScope

  • View: ViewScope

ViewScopeはRecylerView, ListViewなどで有効に使えると思います.