博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Jetpack架构组件之LiveData使用篇
阅读量:4150 次
发布时间:2019-05-25

本文共 3149 字,大约阅读时间需要 10 分钟。

一、LiveData介绍

        从字面意思看出,有生命的数据,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 MutableLiveData
currentName; 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/

你可能感兴趣的文章
Java SE之静态和代码块
查看>>
关于webService的一些理解
查看>>
项目管理工具的使用
查看>>
SpringDataJpa原理及使用
查看>>
懒加载错误的三种处理方案
查看>>
消息队列ActiveMQ的使用
查看>>
定时发短信(quartz框架,阿里大于)
查看>>
常用网址
查看>>
springmvc和mybatis整合(总结)
查看>>
string-boot详解
查看>>
El表达式详解
查看>>
shiro框架
查看>>
类的设计技巧
查看>>
java中跳出外循环或者跳出代码块的方法
查看>>
枚举的使用
查看>>
java的各种跳转总结
查看>>
ImageIO读图片和上传图片到OSS上的bug
查看>>
通过putty将本地文件上传到服务器
查看>>
merge 无效原因及解决方案
查看>>
MySQL数据库中时间设计
查看>>