如何在调用logoutCall方法时自动触发switchMap执行LiveData逻辑?
解决方案
推荐直接移除中间触发用的logoutRequest变量,改用ViewModel官方提供的viewModelScope启动协程执行登出请求,直接将结果推送到可观察的LiveData即可,逻辑更直观,也完全符合你的需求:
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch class YourViewModel: ViewModel() { // 供Activity观察的结果LiveData val logoutUser = MutableLiveData<Resource<*>>() // 从Activity中调用该方法,调用后直接执行登出逻辑 fun logoutCall() { viewModelScope.launch { // 先发送加载状态 logoutUser.value = Resource.loading(data = null) try { val result = mainRepository.logout() logoutUser.value = Resource.success(data = result) } catch (exception: Exception) { val errorMessage = BaseUtils.getError(exception) logoutUser.value = Resource.error(data = null, message = errorMessage) } } } }
注意事项
- 需要确保项目引入了
androidx.lifecycle:lifecycle-viewmodel-ktx依赖才能使用viewModelScope,该作用域会在ViewModel销毁时自动取消所有未完成的协程,避免内存泄漏。 - Activity侧的观察逻辑不需要做任何修改,照旧观察
logoutUser即可接收加载、成功、失败三个状态的回调。 - 如果你有多个类似的手动触发接口请求场景,都可以用这种写法替代原来的
switchMap触发方案,switchMap更适合请求参数会自动变化、需要联动触发请求的场景(比如搜索框输入实时请求搜索结果)。
内容的提问来源于stack exchange,提问作者Programmer007
相关产品推荐
相关产品推荐

