collectAsStateWithLifecycle
ライフサイクルに合わせて安全にFlowを収集します
「collectAsStateWithLifecycle」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。
フローを安全に収集する
Composableでフローを収集する場合、画面がバックグラウンドにある間は収集を停止し、画面に戻ったら再開するのが理想的です。
そのためのツールがcollectAsStateWithLifecycle()です。
collectAsStateの問題点
通常のcollectAsState()は、Composableがコンポジションに存在する限り収集を続けます。アプリがバックグラウンドにある場合も同様です。
そのため、リソースを浪費し、ユーザーに見えない更新まで処理する可能性があります。
collectAsStateWithLifecycleの登場
このライフサイクル対応のコレクターは、ライフサイクルが対象の状態(デフォルトではSTARTED)を下回ると収集を一時停止し、対象の状態に戻ると再開します。
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@Composable
fun Screen(vm: MyViewModel) {
val state by vm.uiState
.collectAsStateWithLifecycle()
Text(state.title)
}依存関係
これはandroidx.lifecycle:lifecycle-runtime-composeアーティファクトに含まれています。importを解決できるよう、モジュールに追加してください。
// build.gradle (module)
implementation(
"androidx.lifecycle:lifecycle-runtime-compose:2.x.x"
)デフォルトの最小状態:STARTED
デフォルトでは、ライフサイクルが少なくともSTARTEDの間、つまり画面が表示されている間は収集が有効です。バックグラウンドに移行してSTARTEDを下回ると、収集は一時停止されます。
最小状態のカスタマイズ
minActiveStateを使うと、しきい値をRESUMEDなどに変更できます。
val state by vm.uiState.collectAsStateWithLifecycle(
minActiveState = Lifecycle.State.RESUMED
)StateFlowとの組み合わせ
これはViewModelから公開するStateFlowと非常に相性が良い仕組みです。フローは常に現在の値を持つため、再び収集を開始すると最新の状態がすぐに表示されます。
private val _uiState = MutableStateFlow(UiState())
val uiState = _uiState.asStateFlow()処理量を削減できる理由
フローがコストの高い計算(大きなリストのフィルタリングやストリームの変換など)を行う場合、バックグラウンドでの収集を一時停止すれば、ユーザーが離れている間はその処理自体が実行されません。
viewModelScopeとの組み合わせ
データを生成する側では、ViewModelがviewModelScope内でデータパイプラインを実行することがよくあります。stateInを使えば、コレクターが存在しないときに上流の処理を停止することもできます。
val uiState = repository.stream()
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = UiState()
)WhileSubscribedの説明
WhileSubscribed(5000)は、最後のコレクターが離れた後も5秒間、上流の処理を維持します。これにより、短時間の構成変更中に処理を再起動せずに済み、ユーザーが本当に離れた場合には処理を停止できます。
ベストプラクティスのまとめ
ViewModelを使用するCompose画面では、次のようにします。
StateFlowを公開します。collectAsStateWithLifecycle()で収集します。- 必要に応じて、上流で
stateIn(WhileSubscribed)を使用します。
理解度チェック
ライフサイクルに対応した収集についての理解度を確認しましょう。
まとめ
学んだこと:
collectAsStateWithLifecycle()は、バックグラウンドでの収集を一時停止します。- デフォルトのしきい値はSTARTEDで、
minActiveStateで変更できます。 - 効率的なパイプラインを構築するには、
StateFlowおよびstateIn(WhileSubscribed)と組み合わせます。
よくある質問
「collectAsStateWithLifecycle」レッスンは無料ですか?
はい。「collectAsStateWithLifecycle」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。
「collectAsStateWithLifecycle」で何を学びますか?
ライフサイクルに合わせて安全にFlowを収集します ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「collectAsStateWithLifecycle」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ViewModelを使う理由
- ViewModelからStateを公開する
- Androidのライフサイクル
- collectAsStateWithLifecycle