我正在我的应用程序上创建登录活动。
当用户尝试登录时,我有一个Viewmodel
++来更新LiveData
TextView并显示有关所有后台工作进度的信息。DataBingind
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()
我可以ViewModel
从 LoginActivty 访问和更新,观察进度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)...
})
State.FAILED
但是我只能在进程失败或成功时访问 Worker 内部的数据State.SUCCEEDED
......
因此,例如,如果Worker
最后 10 秒内的所有工作,我无法ViewModel
从我的登录活动更新,直到所有工作完成......但如果我ViewModel
从 Worker Activity 访问相同的内容,我可以在该过程中更新。
如何从其他 Activity 获取 ViewModel?
如何从 Worker 活动中获取相同的 LoginWorkerViewModel 实例(在 LoginActivity 中创建并为 dataBinding 设置)?