【Android Studio】CoroutineScopeの種類!GlobalScope/viewModelScope/lifecycleScopeの違い
この記事からわかること
- Android StudioのKotlin CoroutinesのCoroutineScopeとは?
- GlobalScope/viewModelScope/lifecycleScopeの違い
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
公式リファレンス:Use Kotlin coroutines with lifecycle-aware components
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
CoroutineScopeとは?
interface CoroutineScope
CoroutineScope
は、Androidアプリ開発で非同期処理を実装できる公式ライブラリ「Kotlin Coroutines」に含まれるinterfaceです。Kotlin Coroutinesではコルーチンという単位で非同期処理が定義されています。そのコルーチンを実行するために必要な情報(スレッドの指定やエラーハンドリングなど)はCoroutineContextが保持しています。そしてコンテキストを提供するのがCoroutineScopeです。
CoroutineScopeはコルーチンを実行できる有効範囲(スコープ)を提供します。これは何かに紐づけられることでスコープとして成り立ちます。ここでCoroutineScopeの種類を見てみます。
CoroutineScopeの種類
- GlobalScope:アプリケーション全体のライフサイクルに関連付けられたスコープ。
- ViewModelScope:ViewModel内で使えるスコープ。ViewModelが破棄されるとコルーチンも自動でキャンセル
- LifecycleScope:ActivityやFragment内で使えるスコープ。特定のライフサイクル状態に合わせたコルーチンを実行
このように特定のクラスなどの生成〜破棄までのライフサイクルと紐づくことで有効範囲(スコープ)は定義されます。そしてスコープに合わせて管理されているコルーチンの生成や破棄を行なってくれます。これにより不要なコルーチンが残り続けたり、メモリリークなどを起こさないようになっています。
GlobalScope
GlobalScopeはその名前の通りグローバルなCoroutineScopeです。アプリケーション全体のライフサイクに紐づけられているためアプリが終了しない限り中のコルーチンも自動で破棄されることはありません。アプリケーション全体で使用できるのは気軽で良いですが思わぬ問題を起こすかもしれないため使用するには注意が必要です。
GlobalScopeは特に依存関係を追加することなく基本的にどこでも使用することができます。例えば以下はDataStoreを使用してデータを操作する処理を内で実行しています。テストや簡易的に試してみたい時などに使えて便利です。
val addButton:Button = findViewById(R.id.add_button)
val getButton:Button = findViewById(R.id.get_button)
addButton.setOnClickListener{
GlobalScope.launch (Dispatchers.IO) {
incrementCounter()
}
}
ViewModelScope
ViewModelScopeはJetPackのコンポーネントの1つとして提供されているViewModelに紐づけられているCoroutineScopeです。ViewModel内で定義されたコルーチンはViewModelが破棄されるタイミングで自動的にキャンセルされます。
ViewModelScopeを使えるようにするためには依存関係を追加する必要があります。
dependencies {
// 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0"
}
追加できたらviewModelScope
でスコープを参照することができます。
class MyViewModel: ViewModel() {
init {
viewModelScope.launch {
// ViewModel がクリアされるとキャンセルされるコルーチン
}
}
}
LifecycleScope
LifecycleScopeはLifecycleオブジェクトに紐づけられているCoroutineScopeです。つまりActivityやFragmentなどのライフサイクルに応じて管理されるようになります。使えるようにするためには依存関係を追加する必要があります。
dependencies {
// 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"
}
追加できたらviewModelScope
でスコープを参照することができます。
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
}
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。