首页 > 解决方案 > Android viewmodel 始终观察

问题描述

我正在使用KoinDI并且我有一个登录屏幕。这是我的代码 -

我的 AppModule 代码显示了LoginViewModelDI 定义 -

private val viewModelModules = module {
    viewModel { LoginViewModel(get()) }
}

我的LoginFragment代码 -

private val viewModel: LoginViewModel by viewModel()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    view.login_button?.setOnClickListener {
        onLoginButtonPressed()
    }
}

private fun onLoginButtonPressed() {
        val email = view?.email_value?.text.toString()
        val password = view?.password_value?.text.toString()

        viewModel.onLoginPressed(email, password).observe(this, Observer {

                if (it.userLoggedIn) {
                    //...
                }
                handleError(it.error)

        })
}

问题是当我单击登录并立即将应用程序置于后台并且 API 调用失败(我故意将其失败以从后端进行测试)并且当我将应用程序置于前台时,我看到视图模型继续观察导致 API呼叫一次又一次地发生,直到成功。为什么会这样?为什么我的视图模型只能在登录按钮单击时观察?

标签: androidandroid-livedataandroid-viewmodelkoin

解决方案


当您说viewModel.onLoginPressed.observe活动/片段将在状态startedresumed状态时接收事件时,当它被销毁时,观察者将自动被删除。

您似乎有一个viewModel不断重试的重试逻辑。


推荐阅读