網(wǎng)易那個網(wǎng)站可以做字幕外貿(mào)網(wǎng)站建設(shè)設(shè)計方案
滿足延遲執(zhí)行、立即執(zhí)行,每次任務(wù)間隔時長,總時長的任務(wù)
使用1
class TimeViewModel:Viewmodel(){//測試延遲5秒開始執(zhí)行任務(wù),然后每隔1秒執(zhí)行1次,總執(zhí)行時間60秒fun testTime(){var startTime = System.currentTimeMillis()log("執(zhí)行 開始 startTime:${startTime}")val job = viewModelScope.startTime(interval = 5000,duration = 1000,totalTime = 60*1000,onNext = {count->log("執(zhí)行次數(shù):${count}")},onFinish = {log("執(zhí)行結(jié)束")log("執(zhí)行 結(jié)束 總耗時:${System.currentTimeMillis() - startTime}")})viewModelScope.launch {delay(20000)log("模擬執(zhí)行手動結(jié)束")job.cancel()}}}
使用2
//立即執(zhí)行任務(wù),然后每隔1秒執(zhí)行1次,總執(zhí)行時間60秒
val job = viewModelScope.startTime(duration = 1000,totalTime = 60*1000,onNext = {count->log("執(zhí)行次數(shù):${count}")},onFinish = {log("執(zhí)行結(jié)束")log("執(zhí)行 結(jié)束 總耗時:${System.currentTimeMillis() - startTime}")})
?使用3
/*立即執(zhí)行任務(wù),然后每間隔1秒執(zhí)行1次,要么手動調(diào)用 job.cancel(),要么等所在協(xié)程生命周期結(jié)束,才會結(jié)束,但不會回調(diào) onFinish
*/val job = viewModelScope.startTime(duration = 1000,onNext = {count->log("執(zhí)行次數(shù):${count}")},onFinish = {log("執(zhí)行結(jié)束")log("執(zhí)行 結(jié)束 總耗時:${System.currentTimeMillis() - startTime}")})
使用4
/*延遲5秒再執(zhí)行任務(wù),然后每間隔1秒執(zhí)行1次,要么手動調(diào)用 job.cancel(),要么等所在協(xié)程生命周期結(jié)束,才會結(jié)束,但不會回調(diào) onFinish
*/ val job = viewModelScope.startTime(interval = 5000,duration = 1000,onNext = {count->log("執(zhí)行次數(shù):${count}")},onFinish = {log("執(zhí)行結(jié)束")log("執(zhí)行 結(jié)束 總耗時:${System.currentTimeMillis() - startTime}")})
?//代碼封裝?
/*** @param interval 單位毫秒,用于定時器延遲時間開啟,例如:interval = 5000,則是5秒后才會開始倒計時* @param duration 單位毫秒,用戶每次定時任務(wù)間隔時長執(zhí)行1次,例如 duration = 1000,則每間隔1秒執(zhí)行1次* @param totalTime 單位毫秒,用于定時器執(zhí)行的總時長,* 如果為空的話,會一直在運行,直到手動調(diào)用cancel 方法,或者所在協(xié)程聲明周期結(jié)束 而結(jié)束* @onNext(count) ,返回每次執(zhí)行的次數(shù)* @onFinish() 任務(wù)正常執(zhí)行完成*/fun CoroutineScope.startTime(interval:Long? = 0,duration:Long,totalTime:Long? = null,onNext:(Int)->Unit,onFinish:(()->Unit)? = null):Job{if (duration<=0){throw IllegalArgumentException("間隔時間必須大于0")}return this.launch {interval?.let { _interval->if (_interval>0){delay(_interval)}}var isStart = truevar runAllTotalTime:Long = 0var count = 0while (isStart){if (totalTime!= null && totalTime>0 && runAllTotalTime>= totalTime){isStart = falseonFinish?.invoke()}else{delay(duration)runAllTotalTime+=durationcount+=1onNext.invoke(count)}}}}