Android Developer

Rxjava Observable转LiveData

目前我的网络使用的是Retrofit,通常得到的结果是Observable,同时我们采用了Google最新的LiveData, 下面介绍如何把Observable转换成LiveData

Observable返回值方法

出于简单介绍目的,我们使用一个很简单的返回Observable的方法

private fun getVideoStatusObservable(): Observable<Boolean> {
        return Observable.just(System.currentTimeMillis() % 2L == 0L)
}

使用 LiveDataObserverAdapter 转换

fun requestVideoStatus(): LiveData<Boolean> {
        return MutableLiveData<Boolean>().apply {
            getVideoStatusObservable().subscribe(LiveDataObserverAdapter<Boolean>(this, false))
        }
}

调用 requestVideoStatus

private fun testObservableToLiveData() {
        viewModel(VideoStatusViewModel::class.java).requestVideoStatus().observe(this, Observer {
            ToastUtil.show("testObservableToLiveData value=$it")
        })
}

LiveDataObserverAdapter 具体怎么实现的

package com.secoo.commonsdk.wrapper;

import android.arch.lifecycle.MutableLiveData;

public class LiveDataObserverAdapter<T> extends ObserverAdapter<T>{
    private MutableLiveData<T> mLiveData;
    /**
     * 默认值,用来处理Rx异常的时候,设置LiveData的值
     */
    private T mFallbackValue;

    public LiveDataObserverAdapter(MutableLiveData<T> liveData, T fallbackValue) {
        mLiveData = liveData;
        mFallbackValue = fallbackValue;
    }

    @Override
    public void onError(Throwable e) {
        super.onError(e);
        mLiveData.setValue(mFallbackValue);
    }

    @Override
    public void onNext(T t) {
        super.onNext(t);
        mLiveData.setValue(t);
    }
}

主要的有几点

  • 持有外部传入的LiveData,当Observable 有返回值时设置LiveData.setValue

  • 接收外部传入的fallbackValue,当Observable 出现异常时,使用fallbackValue设置LiveData,如 mLiveData.setValue(mFallbackValue);

具体的示例代码

  • TestListActivity 搜索即可