Skip to content

Instantly share code, notes, and snippets.

@satoshun
Last active May 30, 2021 04:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save satoshun/beaaa0ae42405188f0f041f54cb0c011 to your computer and use it in GitHub Desktop.
Save satoshun/beaaa0ae42405188f0f041f54cb0c011 to your computer and use it in GitHub Desktop.
addRepeatingJobについて

参考

addRepeatingJobの使い所について

UIレイヤー(Activity, Fragment等)からの、Flowのcollect方法は、大きく次の3つがあります。

// 1. kotlinx coroutineのlaunchを使う
lifecycleScope.launch {
  flow.collect { ... }
}
// 2. launchWhenXXX系を使う
lifecycleScope.launchWhenStarted {
  flow.collect { ... }
}
// 3. 新しく追加されたAPI
addRepeatingJob(...) {
  flow.collect { ... }
}

1、2、3について、それぞれ、説明していきます。

1.について

UIで、launch関数を使うことは(ほぼ)無いと思います。バックグラウンド時など、画面が表示されていないケースでUIを更新する必要がないためです。

3.について

addRepeatingJobは、バックグラウンド時などに、ストリームを終了したいときに使います。言い換えると、重い(高価な)処理をしているときに使います。 例を上げると、callbackFlowを使って、位置情報を取得し続けるような場合です。

callbackFlow<...> {
   val callback = object : LocationCallback() {
     ...
   }
   requestLocationUpdates(..., callback, ...)
    
   ...
}

上記の場合、addRepeatingJobを使うと、バックグラウンド時に位置情報の取得自体のタスクを終了することが出来るので、リソース消費を抑えることが期待出来ます。

逆に次のような場合には、あまり効果がないです。

private val _state = MutableStateFlow<...>()
val state: Flow<...> = state

特にアップストリームで、重い処理をしていないためです。

2.について

3.を使わなくても良い場合には、これを使えば良いので、大体これを使うことになると思います。

まとめ

まとめると次のようになります。

  • launchは使わない
  • 重い処理をアップストリームで行っている場合は、addRepeatingJobを使う
  • それ以外はlaunchWhenXXXを使う。だいたいこれ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment