【Android】rememberCoroutineScope

rememberCoroutineScopeの役割を理解する

rememberCoroutineScopeとは

そのComposableにひも付いたコルーチンスコープを覚えておくことが可能。

なぜこれが必要になるのかというと、Composeは再コンポーズする度に値がリセットされるため、remeberなCoroutineScopeでないと再コンポーズの度にコルーチンスコープが作成されてしまいます。

その結果、スコープの寿命がUIと一致せずにメモリリークなどが起きる可能性が出てきます。

rememberCoroutineScopeはComposableがCompositionに存在している間だけ有効なCoroutineScopeを提供するので、そのComposableが破棄されるとスコープも自動でキャンセルされるため安全です。

そもそもComposable内でコルーチンスコープを利用する場合とは?

ComposableではUIイベントを受け取る存在で、ボタンが押される、アニメーションが始まる、APIを叩くなどが行われる。そのため時間を扱うにはコルーチンが必要となる。

viewModel側で切り替えることもできるが、viewModel側はあくまで指示を出す側なのでUIの詳細な情報を知ることができない。

例えばdelayはsuspend関数なので遅延させる場合はrememberCoroutineScopeを利用して処理の停止を可能にすることができる。

なぜComposable内でいきなりCoroutineScopeが作れるのか?

結論としてはComposeがすでに親のCoroutineContextを持っているためです。

AI先生「Composeは内部で「Recomposer」という存在が動いている。
Recomposerはコルーチン上で動いている」

つまり、Composition自体がすでにコルーチン世界の中にいるということです。そのため現在のCompositionのCoroutineContextを取得し、そこに子Jobを持つScopeを作る形となります。

そしてlaunchするだけで新たな子Jobとして処理が実行可能になります。

これが構造化並行性(Structured Concurrency)と呼ばれる思想!!