倒计时能够说是安卓开发的常见需求,以前实现广泛是如下几种方案android
如今由于有了协程和Flow,咱们能够借助Flow这个工具,更加优雅地实现这个需求功能.git
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"
复制代码
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,更好地实现生命周期管理,避免内存泄漏.github
Demo地址api