Android LiveData相关的学习

LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或Service 等组件的生命周期。它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI。不用担心发生内存泄漏。当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复。它已经帮我们封装好了。当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever 方法,但是你必须在 onDestroy 的时候 removeObserver。

用于解决当网络请求结果回来的时候,要判断 Activity 或者 Fragment 是否已经 Destroy, 如果不是 destroy,更新 UI。使用 Livedata ,因为它是在 Activity 处于 onStart 或者 onResume 的状态时,他才会进行相应的回调,因而可以很好得处理这个问题,不必谢一大堆的 activity.isDestroyed()。

LiveData 使用

1.引入相关的依赖包

// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.0"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.0"

2.在代码中使用

LiveData 是一个抽象类,它的实现子类有 MutableLiveData ,MediatorLiveData。在实际使用中,用得比较多的是 MutableLiveData。他常常结合 ViewModel 一起使用。

首先,我们先写一个类继承我们的 ViewModel,里面持有 mNameEvent。

public class TestViewModel extends ViewModel {
    private MutableLiveData mNameEvent = new MutableLiveData<>();
    public MutableLiveData getNameEvent() {
        return mNameEvent;
    }
}

接着,我们在 Activity 中创建 ViewModel,并监听 ViewModel 里面 mNameEvent 数据的变化,当数据改变的时候,我们打印相应的 log,并设置给 textView,显示在界面上。这样我们就完成了对 mNameEvent 数据源的观察。

mTestViewModel = ViewModelProviders.of(this).get(TestViewModel.class);
MutableLiveData nameEvent = mTestViewModel.getNameEvent();
nameEvent.observe(this, new Observer() {
    @Override
    public void onChanged(@Nullable String s) {
        Log.i(TAG, "onChanged: s = " + s);
        mTvName.setText(s);
    }
});

最后当我们数据源改变的时候,我们需要调用 livedata 的 setValue 或者 postvalue 方法。

他们之间的区别是, 调用 setValue 方法,Observer 的 onChanged 方法会在调用 serValue 方法的线程回调。而postvalue 方法,Observer 的 onChanged 方法将会在主线程回调。
 

mTestViewModel.getNameEvent().setValue(name);

ViewModel 是通过 ViewModelProviders.of(this).get(TestViewModel.class); 方法创建出来的,如果我们要携带参数,调用 ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) 方法,多传递一个 factory 参数。Factory 是一个接口,它只有一个 create 方法。

public interface Factory {
    /**
     * Creates a new instance of the given {@code Class}.
     * 

* * @param modelClass a {@code Class} whose instance is requested * @param The type parameter for the ViewModel. * @return a newly created ViewModel */ @NonNull T create(@NonNull Class modelClass); }

在实际当中,我们的做法是:实现 Factory 接口,重写 create 方法,在create 方法里面调用相应的构造函数,返回相应的实例。

public class TestViewModel extends ViewModel {

    private final String mKey;
    private MutableLiveData mNameEvent = new MutableLiveData<>();

    public MutableLiveData getNameEvent() {
        return mNameEvent;
    }

    public TestViewModel(String key) {
        mKey = key;
    }

    public static class Factory implements ViewModelProvider.Factory {
        private String mKey;

        public Factory(String key) {
            mKey = key;
        }

        @Override
        public  T create(Class modelClass) {
            return (T) new TestViewModel(mKey);
        }
    }

    public String getKey() {
        return mKey;
    }
}

ViewModelProviders.of(this, new TestViewModel.Factory(mkey)).get(TestViewModel.class)

 

你可能感兴趣的:(Android)