【发布时间】:2020-08-03 13:35:16
【问题描述】:
我有一个 val _user: MutableLiveData<Resource<List<ApiUser>>> = MutableLiveData()in viewmodel 但我想 postValue errorException
// A generic class that contains data and status about loading this data.
sealed class Resource<T>(
val data: T? = null,
val message: String? = null
) {
class Success<T>(data: T) : Resource<T>(data)
class Loading<T>(data: T? = null) : Resource<T>(data)
class Error<T>(message: String, data: T? = null) : Resource<T>(data, message)
}
//视图模型
class HomeViewModel : ViewModel() {
val _user: MutableLiveData<Resource<List<ApiUser>>> = MutableLiveData()
var job: CompletableJob? = null
fun f() {
job = Job()
_user.postValue(Resource.Loading(null))
CoroutineScope(IO+job!!).launch {
try {
_user.postValue(Resource.Success(RetrofitBuilder.apiService.getUsers()))
} catch (e: Throwable) {
_user.postValue(Resource.Error("",e))
}
}
}
fun cancelJob() {
job?.cancel()
}
}
//片段
fun subScribeUI() {
viewModel!!._user.observe(viewLifecycleOwner, Observer {
it?.let {
when(it.status) {
Status.LOADING -> {
Timber.d("LOADING")
}
Status.SUCCESS -> {
Timber.d("SUCCESS")
}
Status.ERROR -> {
Timber.d("ERROR")
}
}
}
})
}
override fun onDestroyView() {
super.onDestroyView()
viewModel?.cancelJob()
}
【问题讨论】:
-
为什么要创建一个新范围?您已经拥有
viewModelScope。 -
因为 getUsers() 是挂起函数所以
-
那不是答案,viewModelScope也是协程作用域
-
@EpicPandaForce 你的意思是我应该使用 viewModelScope.launch {} 而不是 CoroutineScope(IO+job!!).launch {}?
-
我相信这确实是他的意思。使用它,您也不需要取消
onDestroy()(或其他任何地方)中的作业,因为viewModelScope已经绑定到viewModels 生命周期。
标签: android kotlin generics android-livedata mutablelivedata