【Android Studio】CoroutineScopeの種類!GlobalScope/viewModelScope/lifecycleScopeの違い

この記事からわかること

  • Android StudioKotlin CoroutinesCoroutineScopeとは?
  • GlobalScope/viewModelScope/lifecycleScope違い

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

公式リファレンス:Use Kotlin coroutines with lifecycle-aware components

公式リファレンス:CoroutineScope

環境

CoroutineScopeとは?

interface CoroutineScope

CoroutineScopeは、Androidアプリ開発で非同期処理を実装できる公式ライブラリ「Kotlin Coroutines」に含まれるinterfaceです。Kotlin Coroutinesではコルーチンという単位で非同期処理が定義されています。そのコルーチンを実行するために必要な情報(スレッドの指定やエラーハンドリングなど)はCoroutineContextが保持しています。そしてコンテキストを提供するのがCoroutineScopeです。

CoroutineScopeはコルーチンを実行できる有効範囲(スコープ)を提供します。これは何かに紐づけられることでスコープとして成り立ちます。ここでCoroutineScopeの種類を見てみます。

CoroutineScopeの種類

  1. GlobalScope:アプリケーション全体のライフサイクルに関連付けられたスコープ。
  2. ViewModelScope:ViewModel内で使えるスコープ。ViewModelが破棄されるとコルーチンも自動でキャンセル
  3. 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 {
            
        }
    }
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index