AAC---LiveData

2018-06-25  本文已影响10人  None_Ling

LiveData

LiveData是一个与Activity/Fragment生命周期相关(lifecycle-aware)的Observer类。而这种相关性(awareness )会导致LiveData中的数据只有在Active状态下才会被回调。

我们可以通过实现了LifeCycleOwner接口的对象来提供生命周期的感知。而LiveData这种方式会使得不用再考虑Activity或者Fragment的泄露,当生命周期结束时,会自动销毁Observer对象。

使用LiveData的好处

使用方法

  1. build.gradle中添加配置
dependencies {
    def lifecycle_version = "1.1.1"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    // alternatively - just ViewModel
    implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin
    // alternatively - just LiveData
    implementation "android.arch.lifecycle:livedata:$lifecycle_version"
    // alternatively - Lifecycles only (no ViewModel or LiveData).
    //     Support library depends on this lightweight import
    implementation "android.arch.lifecycle:runtime:$lifecycle_version"

    annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
    // alternately - if using Java8, use the following instead of compiler
    implementation "android.arch.lifecycle:common-java8:$lifecycle_version"

    // optional - ReactiveStreams support for LiveData
    implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"

    // optional - Test helpers for LiveData
    testImplementation "android.arch.core:core-testing:$lifecycle_version"
}
  1. 创建与LifeCycleOwner相关联的LiveData对象
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        MutableLiveData<UserData> liveData = new MutableLiveData<>();
        liveData.observe(this, new Observer<UserData>() {
            @Override public void onChanged(@Nullable UserData userData) {
                // TODO:
            }
        });
    }

}
  1. LiveData中的数据有变化时候,则可以调用setValue或者在非主线程中调用postValue改变,而修改后的值会通过onChanged方法回调。
liveData.setValue(new UserData());
liveData.postValue(new UserData());

MutableLiveData与MediatorLiveData

MutableLiveData<UserData> localCache = new MutableLiveData<>();
localCache.observe(this, userData -> {
            // TODO:
        });
MutableLiveData<UserData> networkData = new MutableLiveData<>();
networkData.observe(this, userData -> {
            // TODO:
        });
MediatorLiveData<String> live1 = new MediatorLiveData<>();
live1.addSource(localCache, userData -> live1.setValue(userData.getUserName()));
live1.addSource(networkData, userData -> live1.setValue(userData.getUserName()));

与Room与ViewModel组件相辅相成

继承LiveData

通过继承LiveData类重写onActive以及onInactive函数来完成对数据请求/前台耗时操作的回调等等

public class StockLiveData extends LiveData<BigDecimal> {
    private StockManager mStockManager;

    private SimplePriceListener mListener = new SimplePriceListener() {
        @Override
        public void onPriceChanged(BigDecimal price) {
            setValue(price);
        }
    };

    public StockLiveData(String symbol) {
        mStockManager = new StockManager(symbol);
    }

    @Override
    protected void onActive() {
        mStockManager.requestPriceUpdates(mListener);
    }

    @Override
    protected void onInactive() {
        mStockManager.removeUpdates(mListener);
    }
}

以下为当使用单例LiveData时的情况

public class StockLiveData extends LiveData<BigDecimal> {
    private static StockLiveData sInstance;
    private StockManager mStockManager;

    private SimplePriceListener mListener = new SimplePriceListener() {
        @Override
        public void onPriceChanged(BigDecimal price) {
            setValue(price);
        }
    };

    @MainThread
    public static StockLiveData get(String symbol) {
        if (sInstance == null) {
            sInstance = new StockLiveData(symbol);
        }
        return sInstance;
    }

    private StockLiveData(String symbol) {
        mStockManager = new StockManager(symbol);
    }

    @Override
    protected void onActive() {
        mStockManager.requestPriceUpdates(mListener);
    }

    @Override
    protected void onInactive() {
        mStockManager.removeUpdates(mListener);
    }
}

Transformations

主要为了在数据(Value)分发前,修改分发的值。

LiveData<User> userLiveData = ...;
LiveData<String> userName = Transformations.map(userLiveData, user -> {
    user.name + " " + user.lastName
});
private LiveData<User> getUser(String id) {
  ...;
}
LiveData<String> userId = ...;
LiveData<User> user = Transformations.switchMap(userId, id -> getUser(id) );

参考资料

LiveData

上一篇 下一篇

猜你喜欢

热点阅读