android - Android viewmodel 始终观察
问题描述
我正在使用KoinDI
并且我有一个登录屏幕。这是我的代码 -
我的 AppModule 代码显示了LoginViewModel
DI 定义 -
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呼叫一次又一次地发生,直到成功。为什么会这样?为什么我的视图模型只能在登录按钮单击时观察?
解决方案
当您说viewModel.onLoginPressed.observe
活动/片段将在状态started
或resumed
状态时接收事件时,当它被销毁时,观察者将自动被删除。
您似乎有一个viewModel
不断重试的重试逻辑。
推荐阅读
- html - iOS 13 Swift 5 wkwebview - 将文档目录中的图像显示到 wkwebview 真实设备中
- json - SwiftUI:CoreData 和复杂的 JSON
- github - 使用 Github Actions 部署失败
- git - 合并后Gitlab CI自动标记
- linux - 传入流量未转发到正确的 docker 容器
- c# - 如何正确地将 wwwroot 中的图像提供给“页面”子文件夹中的剃须刀页面?
- php - 双循环从数组中提取信息
- spring-boot - 消费者之间的话题分享
- android - 如何为应用程序及其通知设置不同的图标?
- java - 放置此退货声明的正确位置在哪里?