2

我正在我的应用程序上创建登录活动。

当用户尝试登录时,我有一个Viewmodel++来更新LiveDataTextView并显示有关所有后台工作进度的信息。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 设置)?

4

0 回答 0