LoginSignup
4
2

More than 1 year has passed since last update.

Observable.intervalみたいに一定間隔実行をKotlin Flowで書きたい

Last updated at Posted at 2022-01-14

この記事で紹介すること

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)
        }
}

参考文献

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2