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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- コルーチンの基礎とスコープ
- viewModelScopeとDispatcher
- Kotlin Flowの基礎
- StateFlowとSharedFlow