本文共 3149 字,大约阅读时间需要 10 分钟。
从字面意思看出,有生命的数据,LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment 等组件的生命周期。
1、它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI; 2、不用担心发生内存泄漏; 3、当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复。它已经帮我们封装好了; 4、当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever 方法,但是你必须在 onDestroy 的时候 removeObserver。
回想一下,在你的项目中,是不是经常会碰到这样的问题,当网络请求结果回来的时候,你经常需要判断 Activity 或者 Fragment 是否已经 Destroy, 如果不是 destroy,才更新 UI,这样才防止内存泄漏。
而当你如果使用 Livedata 的话,因为它是在 Activity 处于 onStart 或者 onResume 的状态时,他才会进行相应的回调,因而可以很好得处理这个问题,不必写一大堆的 activity.isDestroyed()。接下来,让我们一起来看一下 LiveData 的使用:
1、引入依赖库
implementation "android.arch.lifecycle:extensions:1.1.1"
2、使用LiveData结合ViewModel
LiveData 是一个抽象类,它的实现子类有 MutableLiveData ,MediatorLiveData。在实际使用中,用得比较多的是 MutableLiveData。他常常结合 ViewModel 一起使用。下面,让我们一起来看一下怎样使用它?
首先,我们先写一个类TestViewModel继承我们的 ViewModel,里面持有MutableLiveData类型的currentName;
package com.example.testproject.jetpack;import androidx.lifecycle.MutableLiveData;import androidx.lifecycle.ViewModel;public class TestViewModel extends ViewModel { private MutableLiveDatacurrentName; public int i; public MutableLiveData getCurrentName() { if (currentName == null) { currentName = new MutableLiveData<>(); } return currentName; }}
3、在Activity或者fragment中使用LiveData来setValue()和observe()添加观察者对象;
public class TestActivity extends AppCompatActivity { private TestViewModel mTestViewModel; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textView = findViewById(R.id.tv_content); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String s = "rrrrr" + (mTestViewModel.i++); mTestViewModel.getCurrentName().setValue(s); } }); final TextView textView1 = findViewById(R.id.test); //这是用来对比LiveData的 textView1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { textView1.setText("11112212121212"); } }); mTestViewModel = ViewModelProviders.of(this).get(TestViewModel.class); mTestViewModel.getCurrentName().observe(this, new Observer() { @Override public void onChanged(String s) { textView.setText(s); } }); }}
其中的ViewModel是通过ViewModelProviders.of(this).get(TestViewModel.class);来创建的,通过LiveData对象(被观察者)的observer方法来添加观察者对象,onChanged()监听数据的变化。
mTestViewModel.getCurrentName().setValue(s);
最后当我们点击控件改变数据源的时候,我们需要调用 Livedata 的 setValue 或者 postValue 方法。他们之间的区别是, 调用 setValue 方法,Observer 的 onChanged 方法会在调用 serValue 方法的线程回调。而postValue方法,Observer 的 onChanged 方法将会在主线程回调。
我们运行一下,切换横竖屏,看看普通数据和使用LiveData的数据的变化,我们都知道Android的横竖屏切换是会重新走生命周期的。
当我们点击两个控件,改变控件显示的text:
以上都是竖屏的情况下。现在我们去切换横屏:
看到没有,当我们红框中下面这个TextView没有用LiveData包装的时候,就会重绘制,上面那个控件的数据就没有发生任何变化。是不是很神奇,下一篇讲解LiveData的原理。
转载地址:http://crxti.baihongyu.com/