如何添加CountDownTimer到ViewModel Kotlin?



我试图添加一个CountDownTimer到ViewModel,以便能够旋转屏幕而不会丢失数据,在这种情况下一个计数计时器。在我的代码中,我不知道如何从ViewModel返回countdowntimer值?

我代码:

class MainActivityViewModel: ViewModel() {
val countt = MutableLiveData<Long>()
private val timer = object :CountDownTimer(30000, 2000){
override fun onTick(millisUntilFinished: Long) {
countt.value = millisUntilFinished
}
override fun onFinish() {
}
}
timer.start()
}
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: MainActivityViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

viewModel = ViewModelProvider(this)[MainActivityViewModel::class.java]
viewModel.countt.observe(this, Observer {
binding.countText.text = it.toString()
})
}
}

供参考,如果你不需要超级精确的间隔(因为这不考虑代码执行时间),这里有一种更简单的方法来使用JetpackliveData协程构建器:

class MainActivityViewModel: ViewModel() {
val countt = liveData {
for (value in 300 downTo 0) {
emit(value)
delay(1000)
}
}
}

如果你确实需要它非常精确,我猜你必须更新延迟量以更准确,所以它变得有点混乱:

class MainActivityViewModel: ViewModel() {
val countt = liveData {
val endTime = System.currentTimeMillis() + 300 * 1000
for (value in 300 downTo 0) {
delay(endTime - value * 1000 - System.currentTimeMillis())
emit(value)
}
}
}

现在可以运行了:

class MainActivityViewModel: ViewModel() {
val countt = MutableLiveData<Long>()
private fun timer(){
val timer = object :CountDownTimer(300000, 1000){
override fun onTick(millisUntilFinished: Long) {
countt.value = millisUntilFinished / 1000
}
override fun onFinish() {
}
}
timer.start()
}
val countValue: MutableLiveData<Long>
get() = countt
init {
timer()
}
}

最新更新