我在我的应用上创建了一个登录活动。
我有一个Viewmodel
+ LiveData
+ DataBingind
来更新TextView,并在用户尝试登录时显示有关所有后台工作进度的信息。
lateinit var loginViewModel: LoginViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
loginViewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)
val binding = DataBindingUtil.setContentView(this, R.layout.login_activity) as LoginActivityBinding
binding.viewModel = loginViewModel
binding.setLifecycleOwner(this)
...
}
所有后台工作均由Workers
val loginWork = OneTimeWorkRequestBuilder<LoginWorker>().setInputData(dataBuilder.build()).addTag("LOGIN").build()
val workManager = WorkManager.getInstance()
workManager.beginUniqueWork("LOGIN", ExistingWorkPolicy.REPLACE, loginWork)
.enqueue()
我可以从LoginActivty访问和更新ViewModel
,观察Worker
的进度:
val statusLogeo: LiveData<WorkStatus> = workManager.getStatusById(loginWork.id)
statusLogeo.observe(this, Observer {
if (it != null && it.state == State.FAILED)...
if (it != null && it.state == State.SUCCEEDED)...
})
但是当procces失败State.FAILED
或成功State.SUCCEEDED
时,我只能访问Worker内的数据......
因此,例如,如果Worker
中的所有工作持续10秒,我无法从登录Activy更新ViewModel
,直到完成所有工作...但是如果我访问我可以在该过程中更新来自工作者活动的ViewModel
。
如何从其他Activity获取ViewModel?
如何从Worker活动中获取LoginWorkerViewModel(在LoginActivity中创建并为dataBinding设置)的相同实例?