この記事で紹介すること
Observable.intervalみたいな一定間隔での処理実行をKotlin Flowで書きたい。
flow.interval
みたいなオペレータがなかったので、どうしようかなと。
// これをKotlin Flowで書きたい
val disposable = Observable.interval(100, TimeUnit. MICROSECONDS).startWith(0L)
.subscribeOn(Shedulers.computation())
.subscribe {
// 定期実行したい処理
getHogeHogeData()
}
やり方と解説
Flowの中でdelay関数を使う
解説と言いつつすごい単純で申し訳ないんですが、ループするflowを作って、flowの中にdelay関数を呼んであげれば似たような動作になりました。
// 0.1sec間隔で処理実行
private fun intervalFlow() = flow<hogeHogeData>{
while(true){
// 定期実行したい処理
emit(getHogeHogeData())
delay(100)
}
}
onEach()でdelay関数を使う
呼び出し側で指定したい場合はonEachでdelay関数をセットしてあげてもOKです。
private fun roopFlow() = flow<hogeHogeData>{
while(true){
// 定期実行したい処理
emit(getHogeHogeData())
}
}
var data: hogeHogeData? = null
val job = roopFlow()
.onEach {
data = it
delay(100)
}
.launchIn(coroutineScope)
Kotlin Flowに拘らなくてもOK
なお、呼び出し先が特にないなら単なるCoroutineで良いと思います。
coroutineScope.launch(Dispatchers.Default){
while(true){
// 定期実行したい処理
getHogeHogeData()
delay(100)
}
}