【发布时间】:2023-02-15 13:51:38
【问题描述】:
在 this 问题之后,我在我的应用程序中做了一些简单的更改,但它没有像我预期的那样工作。
我有一个计时器,它在计时器完成时发送通知。单击此通知会重新启动 Activity,删除所有计时器信息,主要存储在viewModel。出于这个原因,我决定为viewModel使用保存的状态。
这是我的viewModel:
class TimerViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
private val _secondsRemaining = savedStateHandle.getLiveData<Long>(SECONDS_REMAINING)
val secondsRemaining : LiveData<Long>
get() = _secondsRemaining
这是我在Fragment中使用viewModel的方法:
private val timerViewModel by viewModels<TimerViewModel>()
当我启动计时器时,我会在时钟的每个滴答声中将剩余秒数保存在 LiveData 中。当计时器结束时,应用程序发送通知,计时器再次启动,计算一个新的周期:
timer = object : CountDownTimer(timerLengthSeconds * 1000, 1000){
override fun onFinish(){
(....)
}
override fun onTick(millisUntilFinished: Long) {
var secondsRemainingInCountdown = millisUntilFinished / 1000
(...)
_secondsRemaining.value = secondsRemainingInCountdown
}
}.start()
}
因此,当计时器结束时,应用程序会发送通知,但计时器已重新启动,并且剩余的秒数正在更新(我已通过日志检查过)。
当用户单击通知时,activity 将被终止并重新启动,并且将看到计时器以及保存在 LiveData 中的剩余秒数。但是当activity重启时,LiveData值为空。
我也尝试过将值设置为 10,以防 LiveData 在首次创建时为 null
private val _secondsRemaining = savedStateHandle.getLiveData<Long>(SECONDS_REMAINING, 10)
但是当活动重新启动时,我得到 10 作为 LiveData 的值
我想不通原因。
我的第二个问题是我想保存一个 LiveData 的状态,它存储一个自定义的 class,它保存时钟的状态
private val _timerState = MutableLiveData<TimerState>()
val timerState : LiveData<TimerState>
get() = _timerState
作为这个class:
sealed class TimerState {
object OnFocusRunning : TimerState()
object OnRestRunning : TimerState()
object OnFocusPaused : TimerState()
object OnRestPaused : TimerState()
object Completed : TimerState()
object RestCompleted : TimerState()
object NotStarted : TimerState()
}
但我没有成功,因为 TimerState 是自定义的 class 而不是原始类型。
【问题讨论】:
标签: android kotlin persistence viewmodel viewmodel-savedstate