可以在 ViewModel 中对 Transformations.map() 返回的 Livedata 调用 observeForever() 吗?
It is ok to call observeForever() on Livedata returned by Transformations.map() inside ViewModel?
我尝试使用 LiveData Transformations.map() 检查结果并更新 UI。但是 Transformations.map() 回调不会在没有观察者的情况下触发。
那么在 Tranformations.map 返回的实时数据上调用 observeForever {}
是个好方法吗?并在 ViewModel 的 onCleared 上删除观察者?
private lateinit var map: LiveData<Unit>
fun getAppConfiguration(): MutableLiveData<TopRatedMoviesResponse> {
progressDialogVisibleLiveData.postValue(true)
val appConfigurationLiveData = MutableLiveData<TopRatedMoviesResponse>()
val appConfigurationSourceLiveData : MutableLiveData<DataResult> = splashScreenRepository.getAppConfiguration(getApplication())
map = Transformations.map(appConfigurationSourceLiveData) { dataResult ->
progressDialogVisibleLiveData.postValue(false)
when (dataResult) {
is DataResultSuccess -> {
appConfigurationLiveData.postValue(dataResult.data as TopRatedMoviesResponse)
}
is DataResultFailed -> {
when (dataResult.errorCode) {
HTTPError.NO_INTERNET -> {
errorDialogVisibleLiveData.postValue(dataResult)
}
HTTPError.BAD_REQUEST -> {
errorDialogVisibleLiveData.postValue(dataResult)
}
HTTPError.UNAUTHORISED -> {
unAuthorisedEventLiveData.postValue(true)
}
HTTPError.FORBIDDEN, HTTPError.NOT_FOUND, HTTPError.INTERNAL_SERVER_ERROR, HTTPError.UNKNOWN -> {
errorDialogVisibleLiveData.postValue(dataResult)
}
}
}
}
}
map.observeForever { }
return appConfigurationLiveData
}
override fun onCleared() {
super.onCleared()
map.removeObserver { }
}
But Transformations.map callback not triggered without observer.
这很正常,如果没有调用 observerForever(),Transformations.map() 返回的 LiveData 没有任何人提供它所持有的数据。
So is it good way to call observeForever {} on livedata returned by
Tranformations.map?
看看您在该方法中所做的事情,答案是否定的,这不是您使用 Transformations.map() 的方式。该方法的目标是在将这些值呈现给观察者之前,对源 LiveData 发出的值应用一些更改。在您的情况下,您需要进行简单的类型更改(从 dataResult.data 到 TopRatedMoviesResponse),并在出现问题时触发一些错误 LiveDatas。检查下面的代码:
fun getAppConfiguration(): MutableLiveData<TopRatedMoviesResponse> {
progressDialogVisibleLiveData.postValue(true)
val appConfigurationSourceLiveData : MutableLiveData<DataResult> = splashScreenRepository.getAppConfiguration(getApplication())
return Transformations.map(appConfigurationSourceLiveData) { dataResult ->
progressDialogVisibleLiveData.postValue(false)
when (dataResult) {
is DataResultSuccess -> {
dataResult.data as TopRatedMoviesResponse
}
is DataResultFailed -> {
when (dataResult.errorCode) {
HTTPError.UNAUTHORISED -> {
unAuthorisedEventLiveData.postValue(true)
}
HTTPError.FORBIDDEN, HTTPError.NOT_FOUND, HTTPError.INTERNAL_SERVER_ERROR, HTTPError.UNKNOWN, HTTPError.NO_INTERNET, HTTPError.BAD_REQUEST -> {
errorDialogVisibleLiveData.postValue(dataResult)
}
}
// we have to return something even if an error occured
// I'm returning null, your UI should handle this
null
}
}
}
}
另请查看 architecture guide,了解使用 LiveData 处理数据和错误的替代方法。
我尝试使用 LiveData Transformations.map() 检查结果并更新 UI。但是 Transformations.map() 回调不会在没有观察者的情况下触发。
那么在 Tranformations.map 返回的实时数据上调用 observeForever {}
是个好方法吗?并在 ViewModel 的 onCleared 上删除观察者?
private lateinit var map: LiveData<Unit>
fun getAppConfiguration(): MutableLiveData<TopRatedMoviesResponse> {
progressDialogVisibleLiveData.postValue(true)
val appConfigurationLiveData = MutableLiveData<TopRatedMoviesResponse>()
val appConfigurationSourceLiveData : MutableLiveData<DataResult> = splashScreenRepository.getAppConfiguration(getApplication())
map = Transformations.map(appConfigurationSourceLiveData) { dataResult ->
progressDialogVisibleLiveData.postValue(false)
when (dataResult) {
is DataResultSuccess -> {
appConfigurationLiveData.postValue(dataResult.data as TopRatedMoviesResponse)
}
is DataResultFailed -> {
when (dataResult.errorCode) {
HTTPError.NO_INTERNET -> {
errorDialogVisibleLiveData.postValue(dataResult)
}
HTTPError.BAD_REQUEST -> {
errorDialogVisibleLiveData.postValue(dataResult)
}
HTTPError.UNAUTHORISED -> {
unAuthorisedEventLiveData.postValue(true)
}
HTTPError.FORBIDDEN, HTTPError.NOT_FOUND, HTTPError.INTERNAL_SERVER_ERROR, HTTPError.UNKNOWN -> {
errorDialogVisibleLiveData.postValue(dataResult)
}
}
}
}
}
map.observeForever { }
return appConfigurationLiveData
}
override fun onCleared() {
super.onCleared()
map.removeObserver { }
}
But Transformations.map callback not triggered without observer.
这很正常,如果没有调用 observerForever(),Transformations.map() 返回的 LiveData 没有任何人提供它所持有的数据。
So is it good way to call observeForever {} on livedata returned by Tranformations.map?
看看您在该方法中所做的事情,答案是否定的,这不是您使用 Transformations.map() 的方式。该方法的目标是在将这些值呈现给观察者之前,对源 LiveData 发出的值应用一些更改。在您的情况下,您需要进行简单的类型更改(从 dataResult.data 到 TopRatedMoviesResponse),并在出现问题时触发一些错误 LiveDatas。检查下面的代码:
fun getAppConfiguration(): MutableLiveData<TopRatedMoviesResponse> {
progressDialogVisibleLiveData.postValue(true)
val appConfigurationSourceLiveData : MutableLiveData<DataResult> = splashScreenRepository.getAppConfiguration(getApplication())
return Transformations.map(appConfigurationSourceLiveData) { dataResult ->
progressDialogVisibleLiveData.postValue(false)
when (dataResult) {
is DataResultSuccess -> {
dataResult.data as TopRatedMoviesResponse
}
is DataResultFailed -> {
when (dataResult.errorCode) {
HTTPError.UNAUTHORISED -> {
unAuthorisedEventLiveData.postValue(true)
}
HTTPError.FORBIDDEN, HTTPError.NOT_FOUND, HTTPError.INTERNAL_SERVER_ERROR, HTTPError.UNKNOWN, HTTPError.NO_INTERNET, HTTPError.BAD_REQUEST -> {
errorDialogVisibleLiveData.postValue(dataResult)
}
}
// we have to return something even if an error occured
// I'm returning null, your UI should handle this
null
}
}
}
}
另请查看 architecture guide,了解使用 LiveData 处理数据和错误的替代方法。