1.前言
LiveData
是Google推出的一系列的框架组件的其中一个,它是一个可以被观察的数据持有类,能够感知Activity
、Fragment
等组件的生命周期。
一个观察者去观察LiveData
后,当观察者的生命周期处于STARTED
或RESUMED
状态时(即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对象
通常,会在Activity
的onCreate()
方法中开始对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
并没有提供类似方法。当调用MutableLiveData
的setValue(T)
或postValue(T)
方法后,Observer
的onChanged()
方法将会被回调,从而实现更新UI的操作。
注意,这是在观察者处于STARTED
或RESUMED
状态时,LiveData
才会通知观察者数据变化;当观察者处于其他状态时,即使LiveData
的数据变化了,也不会通知。
当组件的状态为DESTROYED
时会自动移除观察者,这样Activity
或Fragment
就可以安全地观察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);