Android 即使片段被破坏,我如何保持livedata在viewmodel中运行?

Android 即使片段被破坏,我如何保持livedata在viewmodel中运行?,android,android-fragments,android-livedata,Android,Android Fragments,Android Livedata,这里我有两个ui页面:主页片段和计时器片段 计时器片段的任务是显示在viewModel中运行的计时器计数器值。 但我的问题是,当我回到主片段并再次转到计时器片段时,计时器被重置,并从“再次开始”开始倒计时。那么,有没有一种方法可以继续倒计时,即使我弹出“回到家”片段,比如计时器还剩30秒,我回到家片段5秒,然后再次输入TimerFragment,然后显示“还剩25秒”,而不是从一开始就重新开始计数?多谢各位 这是我的密码 TimerViewModel.kt lateinit var timer

这里我有两个ui页面:主页片段和计时器片段

计时器片段的任务是显示在viewModel中运行的计时器计数器值。 但我的问题是,当我回到主片段并再次转到计时器片段时,计时器被重置,并从“再次开始”开始倒计时。那么,有没有一种方法可以继续倒计时,即使我弹出“回到家”片段,比如计时器还剩30秒,我回到家片段5秒,然后再次输入TimerFragment,然后显示“还剩25秒”,而不是从一开始就重新开始计数?多谢各位

这是我的密码 TimerViewModel.kt

lateinit var timer : CountDownTimer 
var timerData =  MutableLiveData<Long>()

fun startTimer(){
    timer = object : CountDownTimer(30000,1000){
        override fun onTick(millisUntilFinished: Long) {
            timerData.value = millisUntilFinished/1000
        }

        override fun onFinish() {
            timerData.value = 1000
        }
    }
    if (timerData.value==null){
        timer.start()
    }
}
下面是我如何使用导航从homeFragment到TimerFragment的过程

HomeFragmentDirections.actionHomeToTimerFragment()
it.findNavController().navigate(direction)
我的viewModel注入函数

inline fun <reified T : ViewModel> Fragment.injectViewModel(factory: 
ViewModelProvider.Factory): T {
return ViewModelProviders.of(this, factory)[T::class.java]
}
inline fun Fragment.injectViewModel(工厂:
ViewModelProvider.Factory):T{
返回ViewModelProviders.of(this,factory)[T::class.java]
}

使用getActivity()方法初始化片段中的Viewmodel 例子: ViewModelProvider(requirectivity())[ViemodelName::class.java]


通过这种方式,viewmodel实例将绑定到活动生命周期,并且只有在活动被销毁时才会清除,并且即使片段被销毁,计时器实例也不会被销毁。如果有任何混淆,请告诉我。

使用getActivity()方法在片段中初始化viewmodel 例子: ViewModelProvider(requirectivity())[ViemodelName::class.java]


通过这种方式,viewmodel实例将绑定到活动生命周期,并且只有在活动被销毁时才会被清除,并且即使片段被销毁,您的计时器实例也不会被销毁。如果您有任何疑问,请告诉我。

您的
ViewModelStoreOwner
应该是该片段的父活动要在片段创建和销毁之间持久化的ViewModel

injectViewModel
函数中,执行以下操作:

return ViewModelProvider(requireActivity(), viewModelFactory).(TimerViewModel::class.java)

使用此方法,ViewModel将绑定到活动的生命周期,并且仅在活动被销毁后才会被销毁。

您的
ViewModelStoreOwner
应该是片段的父活动,以便ViewModel在片段创建和销毁之间保持不变

injectViewModel
函数中,执行以下操作:

return ViewModelProvider(requireActivity(), viewModelFactory).(TimerViewModel::class.java)

使用此方法,ViewModel将绑定到活动的生命周期,并且只有在活动被销毁后才会被销毁。

根据您编写的内容,计时器似乎不应该成为ViewModel的一部分。您可以使用一个共享的ViewModel,其作用域为活动生命周期。根据您编写的内容,计时器似乎不应该是viewmodel的一部分。您可以使用范围限定为活动生命周期的共享viewmodel。