Android框架组件--LiveData的使用

1.前言

LiveData是Google推出的一系列的框架组件的其中一个,它是一个可以被观察的数据持有类,能够感知ActivityFragment等组件的生命周期。

一个观察者去观察LiveData后,当观察者的生命周期处于STARTEDRESUMED状态时(即onStart()onResume()onPause()),LiveData的数据发生变化,则会通知观察者;若观察者处于其他状态,即使LiveData的数据发生变化,也不会发出通知。

正是由于这一特性,因此LiveData可以做到仅在组件处于活跃状态时才进行更新UI的操作。

使用LiveData前需要先了解Lifecycle,如果还不知道Lifecycle,可以看下这篇文章:Android框架组件–Lifecycle的使用

本文主要介绍如何使用LiveData

2.LiveData使用例子

下面来看下如何使用LiveData

3.1 添加依赖

在相应的moudle目录下的build.gradle中添加以下依赖:

dependencies {
   
    //...
    def lifecycle_version = "1.1.1"
    //仅仅依赖LiveData
    implementation "android.arch.lifecycle:livedata:$lifecycle_version"
}

3.2 创建LiveData对象

google官网提倡LiveData配合ViewModel一起使用。为了专注LiveData,这里先不用ViewModel,后面再补充说明如何跟ViewModel一起使用。直接看例子:

public class TestModel {
   
    private MutableLiveData<String> status;

    public MutableLiveData<String> getStatus() {
   
        if (status == null)
            status = new MutableLiveData<>();
        return status;
    }
}

MutableLiveData继承自LiveData,表示可变数据。这里创建一个保存String类型数据的LiveData

3.3 观察LiveData对象

通常,会在ActivityonCreate()方法中开始对LiveData的观察:

public class TestActivity extends AppCompatActivity {
   

    private static final String TAG = "test";

    private TextView mTextView;
    private TestModel mTestModel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);

        setContentView(R.layout.test_activity);
        mTextView = findViewById(R.id.tv_test);

        initVariable();
    }

    private void initVariable() {
   
        //创建一个观察者去更新UI
        final Observer<String> statusObserver = new Observer<String>() {
   
            @Override
            public void onChanged(@Nullable final String newName) {
   
                Log.d(TAG, "onChanged: " + newName);
                mTextView.setText(newName);
            }
        };
        //创建TestModel对象
        mTestModel = new TestModel();
        //观察LiveData对象
        //这里的this指的是LifecycleOwner,即LiveData会跟生命周期联系起来
        mTestModel.getStatus().observe(this, statusObserver);
    }
}

观察者可以通过observe()方法对LiveData进行监听,observe()方法需要传递一个LifecycleOwner参数进去,这表示LiveData会跟生命周期联系起来。

另外还有一个observeForever()方法,只需传递一个观察者进去就行,这意味着它跟生命周期没有任何关系,可以持续的观察,只要数据发生变化,都会通知观察者回调onChanged()

3.4 更新LiveData对象

MutableLiveData提供了setValue(T)(主线程使用)和postValue(T)(子线程使用)两个方法来修改数据。LiveData并没有提供类似方法。当调用MutableLiveDatasetValue(T)postValue(T)方法后,ObserveronChanged()方法将会被回调,从而实现更新UI的操作。

注意,这是在观察者处于STARTEDRESUMED状态时,LiveData才会通知观察者数据变化;当观察者处于其他状态时,即使LiveData的数据变化了,也不会通知。

当组件的状态为DESTROYED时会自动移除观察者,这样ActivityFragment就可以安全地观察LiveData而不用担心造成内存泄露。

我们来看个完整的例子:

public class TestActivity extends AppCompatActivity {
   

    private static final String TAG = "test";

    private TextView mTextView;
    private TestModel mTestModel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值