不管LiveData是与组件的生命周期相关联,还是其采用观察者模式检测数值的变化,它有什么吸引力让我们使用它呢?
- 避免内存泄漏: 由于Observers绑定本身的Lifecycle对象, 当Lifecycle被销毁时, 其自动被移除。
- Activity处于onstop状态时, 不会导致应用程序意外崩溃:
当观察者的的生命周期处于非活动状态(比如Activity处于后台堆栈)时, Observer不会接到数据的变化 收到更改事件 - 始终保持最新的数据: 当Lifecycle再次回到可活动状态时(比如Activity从后台堆栈返回到前台), 它会受到最新的更改信息
- 适当的配置更改: 如果由于配置更改(比如设置旋转)重新创建Activity/Fragment时, 会立即接收到最有可用的数据。
- 共享资源: 可用保留一个有用的实例, 分享给多个Activity或者Fragment
- 没有针对生命周期做出多余的针对处理: 一切生命周期的变化, 所造成的的处理事务, 由LiveData自动管理。
在LiveData中,有4个重要的方法:
- onActive(): 当LiveData有可观察的对象时回调
- onInactive(): 当LiveData没有可观察的对象时回调
- setValue(): 当LiveData更新实例的值时调用, 并通知Observer数据的更改,只能在主线程
- postValue(): 当LiveData更新实例的值时调用, 并通知Observer数据的更改,可以在任意线程
使用
两种使用方式:
1.使用LiveData对象
2.继承LiveData类
使用LiveData对象
使用LiveData对象主要有以下几个步骤:
1.创建保存特定数据类型的LiveData实例;
2.创建Observer对象,作为参数传入LiveData.observe()方法添加观察者;
3.更新Livedata对象存储的数据;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MutableLiveData<String> liveData = new MutableLiveData<>();
final TextView textView = findViewById(R.id.text);
Button button = findViewById(R.id.change);
liveData.observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
liveData.postValue("6");
}
});
}
}