Kotlin使用flow實(shí)現(xiàn)倒計(jì)時(shí)功能(示例詳解)
一、效果圖

二、ExtendContext.kt 文件代碼
注意:創(chuàng)建ExtendContext.kt選擇file
使用kotlin擴(kuò)展方法的特性創(chuàng)建countDown擴(kuò)展方法,避免多個(gè)地方使用倒計(jì)時(shí)重復(fù)創(chuàng)建countDown方法

package com.example.baselib.extension
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch
fun FragmentActivity.countDown(
timeMillis: Long = 1000,//默認(rèn)時(shí)間間隔 1 秒
time: Int = 3,//默認(rèn)時(shí)間為 3 秒
start: (scop: CoroutineScope) -> Unit,
end: () -> Unit,
next: (time: Int) -> Unit,
error: (msg: String?) -> Unit
) {
lifecycleScope.launch {
flow {
(time downTo 1).forEach {
delay(timeMillis)
emit(it)
}
}.onStart {
start(this@launch)
}.onCompletion {
end()
}.catch {
error(it.message ?: "countDown 出現(xiàn)未知錯(cuò)誤")
}.collect {
next(it)
}
}
}三、MainActivity.kt代碼
package com.example.testkotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.baselib.extension.countDown
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel
class MainActivity : AppCompatActivity() {
private var mCountDown: CoroutineScope? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loadData()
}
private fun loadData() {
this.countDown(time = 5, start = {
mCountDown = it
}, end = {
Log.i("==", "倒計(jì)時(shí)結(jié)束了")
}, next = {
Log.i("==", "剩余 $it 秒")
}, error = {
})
}
override fun onDestroy() {
mCountDown?.let {
it.cancel()
}
super.onDestroy()
}
}四、build.gradle.kts代碼
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.example.testkotlin"
compileSdk = 34
defaultConfig {
applicationId = "com.example.testkotlin"
minSdk = 23
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}擴(kuò)展:
kotlin——倒計(jì)時(shí)(CountDownTimer和flow形式)
一、kotlin倒計(jì)時(shí)-谷歌CountDownTimer
簡(jiǎn)介:谷歌官方推薦使用CountDownTimer,非常的簡(jiǎn)單好用,代碼也很少
代碼
var TotalTime : Long = 2*60*60*1000 //總時(shí)長(zhǎng) 2小時(shí)
var countDownTimer=object : CountDownTimer(TotalTime,1000){//1000ms運(yùn)行一次onTick里面的方法
override fun onFinish() {
Log.d(TAG,"==倒計(jì)時(shí)結(jié)束")
}
override fun onTick(millisUntilFinished: Long) {
var hour=millisUntilFinished/1000/60/60
var minute=millisUntilFinished/1000/60%60
var second=millisUntilFinished/1000%60
Log.d(TAG,"==倒計(jì)時(shí)"+hour+"小時(shí)"+minute+"分"+second+"秒")
}
}.start()使用說(shuō)明
1、把這段代碼放到類的屬性里就可以自動(dòng)運(yùn)行了
2、把上面代碼中的.start()去掉,然后在需要用到的地方countDownTimer.start()就可以運(yùn)行了
二、kotlin倒計(jì)時(shí)-谷歌CountDownTimer
引入?yún)f(xié)程:implementation ‘androidx.lifecycle:lifecycle-runtime-ktx:2.2.0’ // 協(xié)程lifecycleScope
倒計(jì)時(shí)代碼(擴(kuò)展方法):
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch
/**
* 擴(kuò)展方法
* 倒計(jì)時(shí)的實(shí)現(xiàn)
*/
fun AppCompatActivity.countDown(
time: Int = 30,
start: (scop: CoroutineScope) -> Unit,
next: (time: String) -> Unit,
end: () -> Unit
) {
lifecycleScope.launch {
// 在這個(gè)范圍內(nèi)啟動(dòng)的協(xié)程會(huì)在Lifecycle被銷毀的時(shí)候自動(dòng)取消
flow {
(time downTo 0).forEach {
delay(1000)
emit(it)
}
}.onStart {
// 倒計(jì)時(shí)開(kāi)始 ,在這里可以讓Button 禁止點(diǎn)擊狀態(tài)
start(this@launch)
}.onCompletion {
// 倒計(jì)時(shí)結(jié)束 ,在這里可以讓Button 恢復(fù)點(diǎn)擊狀態(tài)
end()
}.catch {
//錯(cuò)誤
Log.e("", it.message ?: "Unkown Error")
}.collect {
// 在這里 更新值來(lái)顯示到UI
next(it.toString())
}
}
}到此這篇關(guān)于Kotlin使用flow實(shí)現(xiàn)倒計(jì)時(shí)功能的文章就介紹到這了,更多相關(guān)Kotlin倒計(jì)時(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Kotlin協(xié)程之Flow基礎(chǔ)原理示例解析
- Kotlin Flow常見(jiàn)場(chǎng)景下的使用實(shí)例
- Kotlin Flow封裝類SharedFlow StateFlow LiveData使用對(duì)比
- Kotlin Flow常用封裝類StateFlow使用詳解
- Kotlin Flow操作符及基本使用詳解
- Kotlin + Flow 實(shí)現(xiàn)Android 應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)
- Android使用Kotlin和RxJava 2.×實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)效果
相關(guān)文章
Android SlidingDrawer 抽屜效果的實(shí)現(xiàn)
本篇文章小編為大家介紹,Android SlidingDrawer 抽屜效果的實(shí)現(xiàn)。需要的朋友參考下2013-04-04
Kotlin中List的Lambda表達(dá)式應(yīng)用與解析實(shí)例詳解
相比于Java的Lambda表達(dá)式只是一種簡(jiǎn)化寫(xiě)法,Kotlin中的Lambda功能極為強(qiáng)大,本文介紹Kotlin中List的Lambda表達(dá)式應(yīng)用與解析,感興趣的朋友一起看看吧2024-03-03
Android編程實(shí)現(xiàn)使用handler在子線程中更新UI示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)使用handler在子線程中更新UI,涉及Android線程與界面布局相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Android自定義滑動(dòng)接聽(tīng)電話控件組實(shí)例
這篇文章主要介紹了Android自定義滑動(dòng)接聽(tīng)電話控件組,接聽(tīng)電話可以左右滑動(dòng),感興趣的小伙伴們可以參考一下。2016-10-10
Android中一個(gè)應(yīng)用實(shí)現(xiàn)多個(gè)圖標(biāo)的幾種方式
這篇文章主要給大家介紹了在Android中一個(gè)應(yīng)用如何實(shí)現(xiàn)多個(gè)圖標(biāo)的幾種方式,其中包括了多Activity + intent-filter方式、activity-alias方式以及網(wǎng)頁(yè)標(biāo)簽-添加快捷方式,分別給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒。2017-05-05
Android圖片異步加載框架Android-Universal-Image-Loader
這篇文章主要介紹了Android圖片異步加載框架Android-Universal-Image-Loader,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

