0Pricing
Android Academy · レッスン

viewModelScopeとDispatcher

正しいスレッドで処理を実行します

「viewModelScopeとDispatcher」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

ライフサイクル対応のscope

Androidには、自動的にキャンセルされる組み込みのscopeが用意されています:

  • viewModelScope — ViewModelが破棄されるとキャンセルされます。
  • lifecycleScope — ActivityまたはFragmentのライフサイクルに関連付けられます。

viewModelScopeを使う

viewModelScopeでデータ処理を起動します。ViewModelが破棄されると、コルーチンも自動的にキャンセルされるため、手動で後始末する必要はありません。

class UserViewModel(
    private val repo: UserRepository
) : ViewModel() {
    fun load() {
        viewModelScope.launch {
            val users = repo.getUsers()
            _uiState.value = UiState(users)
        }
    }
}

GlobalScopeを使わない理由

GlobalScopeは避けてください。そのコルーチンはアプリ全体の実行中存続し、ライフサイクルに関連付けられません。そのため、リークや画面が閉じた後も処理が継続する問題につながります。

Dispatcherとは

Dispatcherは、コルーチンを実行するスレッド(またはプール)を決定します。適切なものを選ぶことで、メインスレッドを空けておけます。

標準Dispatcher

  • Dispatchers.Main — UIスレッド。
  • Dispatchers.IO — ネットワークやディスクI/O用。
  • Dispatchers.Default — CPU負荷の高い処理用。

viewModelScopeのデフォルトはMain

viewModelScopeはDispatchers.Main上で起動します。状態の更新には適していますが、負荷の高い処理は別のDispatcherに移す必要があります。

withContextで切り替える

withContextを使うと、別のDispatcher上でブロックを実行し、処理後に呼び出し元へ戻れます。

suspend fun loadFile(): String =
    withContext(Dispatchers.IO) {
        File("data.txt").readText()
    }

Main-Safe関数

内部でDispatcherを切り替えるため、メインスレッドから安全に呼び出せる関数をmain-safeといいます。呼び出し側がスレッドを気にせずに済むよう、Repositoryはmain-safeにするべきです。

class Repo {
    suspend fun getUsers() =
        withContext(Dispatchers.IO) { dao.getAll() }
}

RoomとRetrofitはMain-Safe

朗報です。Roomのsuspend DAOメソッドとRetrofitのsuspend呼び出しは、すでにメインスレッド以外で実行されます。通常、これらに明示的なwithContextは必要ありません。

DefaultでCPU処理を行う

巨大なリストの並べ替えや解析など、負荷の高い計算にはDispatchers.Defaultを使い、UIのカクつきを避けます。

val sorted = withContext(Dispatchers.Default) {
    bigList.sortedBy { it.score }
}

Dispatcherを注入する

テストしやすくするため、Dispatcherをハードコードせずに注入します。これにより、テストでテスト用Dispatcherに差し替えられます。

class Repo(
    private val io: CoroutineDispatcher = Dispatchers.IO
) {
    suspend fun load() = withContext(io) { /* ... */ }
}

理解度チェック

scopeとDispatcherについての理解度を確認しましょう。

まとめ

学習した内容:

  • viewModelScopeはViewModelが破棄されるとコルーチンをキャンセルします。
  • GlobalScopeは避けます。
  • Dispatcherを選択します:Main(UI)、IO(ネットワーク/ディスク)、Default(CPU)。
  • withContextでスレッドを切り替え、main-safeな関数を目指します。

よくある質問

「viewModelScopeとDispatcher」レッスンは無料ですか?

はい。「viewModelScopeとDispatcher」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「viewModelScopeとDispatcher」で何を学びますか?

正しいスレッドで処理を実行します ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「viewModelScopeとDispatcher」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コルーチンの基礎とスコープ
  2. viewModelScopeとDispatcher
  3. Kotlin Flowの基礎
  4. StateFlowとSharedFlow
← Android Academyに戻る