如何使用LiveData处理错误状态?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (4)
  • 关注 (1)
  • 查看 (218)

LiveData在某些场景中,可以用作RxJava可观测值的替代。然而,不像ObservableLiveData错误没有回调。

我的问题是:我应该如何处理LiveData,例如,当它由一些网络资源支持时,由于IOException异常可能无法检索?

提问于
用户回答回答于

用某种错误消息传递从LiveData返回的数据

public class DataWrapper<T>T{
    private T data;
    private ErrorObject error; //or A message String, Or whatever
}

//现在在你的LifecycleRegistryOwner

LiveData<DataWrapper<SomeObjectClass>> result = modelView.getResult();

result.observe(this, newData ->{
    if(newData.error != null){ //Can also have a Status Enum
        //Handle Error
    }
    else{
       //Handle data
    }

});

抓住一个Exception而不是扔出去。使用Error对象将此数据传递给UI。

MutableLiveData<DataWrapper<SomObject>> liveData = new...;

//On Exception catching:
liveData.set(new DataWrapper(null, new ErrorObject(e));
用户回答回答于

在我的应用程序中,我不得不将RxJava可观测数据转换成LiveData。当然,在这样做时,我必须维护错误状态。

class LiveDataResult<T>(val data: T?, val error: Throwable?)

class LiveObservableData<T>(private val observable: Observable<T>) : LiveData<LiveDataResult<T>>() {
    private var disposable = CompositeDisposable()

    override fun onActive() {
        super.onActive()

        disposable.add(observable.subscribe({
            value = LiveDataResult(it, null)
        }, {
            value = LiveDataResult(null, it)
        }))
    }

    override fun onInactive() {
        super.onInactive()

        disposable.clear()
    }
}
用户回答回答于

另一种方法是使用MediatorLiveData这将需要LiveData不同类型的。这将使每个事件分开:

例如:

open class BaseViewModel : ViewModel() {
    private val errorLiveData: MutableLiveData<Throwable> = MutableLiveData()
    private val loadingStateLiveData: MutableLiveData<Int> = MutableLiveData()
    lateinit var errorObserver: Observer<Throwable>
    lateinit var loadingObserver: Observer<Int>
    fun <T> fromPublisher(publisher: Publisher<T>): MediatorLiveData<T> {
        val mainLiveData = MediatorLiveData<T>()
        mainLiveData.addSource(errorLiveData, errorObserver)
        mainLiveData.addSource(loadingStateLiveData, loadingObserver)
        publisher.subscribe(object : Subscriber<T> {

            override fun onSubscribe(s: Subscription) {
                s.request(java.lang.Long.MAX_VALUE)
                loadingStateLiveData.postValue(LoadingState.LOADING)
            }

            override fun onNext(t: T) {
                mainLiveData.postValue(t)
            }

            override fun onError(t: Throwable) {
                errorLiveData.postValue(t)
            }

            override fun onComplete() {
                loadingStateLiveData.postValue(LoadingState.NOT_LOADING)
            }
        })

        return mainLiveData 
    }

}

在这个例子中,一旦MediatorLiveData将有活跃的观察者,加载和错误的LiveData将开始被观察。

扫码关注云+社区

领取腾讯云代金券