Kotlin Flow 开发应用实践之倒计时

7,355 阅读1分钟

倒计时可以说是安卓开发的常见需求,之前实现普遍是以下几种方案

  • handler+postDelayed() 方式
  • Timer + TimerTask + handler 方式
  • ScheduledExecutorService + handler 方式
  • RxJava 方式
  • CountDownTimer 方式

现在因为有了协程和Flow,我们可以借助Flow这个工具,更加优雅地实现这个需求功能.

  1. 依赖导入
    api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
    api 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
    // lifecycleScope(可选)
    api "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
  1. 代码实现
 fun countDownCoroutines(total:Int,onTick:(Int)->Unit,onFinish:()->Unit,
                        scope: CoroutineScope = GlobalScope):Job{
    return flow{
        for (i in total downTo 0){
            emit(i)
            delay(1000)
        }
    }.flowOn(Dispatchers.Default)
        .onCompletion { onFinish.invoke() }
        .onEach { onTick.invoke(it) }
        .flowOn(Dispatchers.Main)
        .launchIn(scope)
}

利用Flow实现整个流程更加流程和优雅,CoroutineScope默认使用GlobalScope,考虑到内存泄漏,建议使用lifecycleScope,更好地实现生命周期管理,避免内存泄漏.

Demo地址