LiveData 仅在数据发生更改时才发送更新,并且仅发送给活跃观察者 。此行为的一种例外情况是,观察者从非活跃状态更改为活跃状态时也会收到更新 。此外,如果观察者第二次从非活跃状态更改为活跃状态,则只有在自上次变为活跃状态以来值发生了更改时,它才会收到更新 。
以下示例代码说明了如何开始观察 LiveData 对象:
public class NameActivity extends AppCompatActivity {private NameViewModel model;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Other code to setup the activity...// Get the ViewModel.model = new ViewModelProvider(this).get(NameViewModel.class);// Create the observer which updates the UI.final Observer<String> nameObserver = new Observer<String>() {@Overridepublic void onChanged(@Nullable final String newName) {// Update the UI, in this case, a TextView.nameTextView.setText(newName);}};// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.model.getCurrentName().observe(this, nameObserver);}}3、更新 LiveData 对象
LiveData 没有公开可用的方法来更新存储的数据 。MutableLiveData 类将公开 setValue(T) 和 postValue(T) 方法,如果您需要修改存储在 LiveData 对象中的值,则必须使用这些方法 。通常情况下会在 ViewModel 中使用 MutableLiveData,然后 ViewModel 只会向观察者公开不可变的 LiveData 对象 。
设置观察者关系后,您可以更新 LiveData 对象的值(如以下示例中所示),这样当用户点按某个按钮时会触发所有观察者:
button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String anotherName = "John Doe";model.getCurrentName().setValue(anotherName);}});注意:您必须调用 setValue(T) 方法以从主线程更新 LiveData 对象 。如果在 worker 线程中执行代码,则您可以改用 postValue(T) 方法来更新 LiveData 对象 。3、Data BindingData Binding是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源 。

文章插图
专栏
Spring Cloud Alibaba微服务实战
作者:猿芯
36币
68人已购
查看布局通常是使用调用界面框架方法的代码在 Activity 中定义的 。例如,以下代码调用 findViewById() 来查找 TextView 控件并将其绑定到 viewModel 变量的 userName 属性:
TextView textView = findViewById(R.id.sample_text);textView.setText(viewModel.getUserName());以下示例展示了如何在布局文件中使用Data Binding 将文本直接分配到TextView 。这样就无需调用上述任何 Java 代码 。请注意赋值表达式中 @{} 语法的使用:<TextViewandroid:text="@{viewmodel.userName}" />注意:Data Binding使用场景:布局和绑定表达式
如果您使用Data Biding的主要目的是取代 findViewById() 调用,请考虑改用ViewBinding 。
使用过ButterKnife的都知道,目前ButterKnife作者建议切换至ViewBindng使用;在许多情况下,ViewBinding可简化实现,提高性能,提供与DataBinding相同的好处 。
数据绑定的布局以根标记 layout 开头,后跟 data 元素和 view 根元素 。如下:
注意:布局表达式应保持精简,因为它们无法进行单元测试,并且拥有的 IDE 支持也有限 。为了简化布局表达式,可以使用自定义绑定适配器 。
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"><!--data 中的 user 变量描述了可在此布局中使用的属性 。--><data><variable name="user" type="com.example.User"/></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><!--布局中的表达式使用“@{}”语法给控件赋值 。--><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.firstName}"/><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.lastName}"/></LinearLayout></layout>系统会为每个布局文件生成一个绑定类 。1、默认情况下,类名称基于布局文件的名称,它会转换为驼峰形式并在末尾添加 Binding 后缀 。
2、以上布局文件名为 activity_main.xml,因此生成的对应类为 ActivityMainBinding,且都是ViewDataBinding的子类,所有布局对应的生成的绑定类都可以是ViewDataBinding类
推荐阅读
- 你的平台有这四大技术架构群吗?
- SMP、MPP和Hadoop数据库架构方案
- 搞懂Android应用启动过程,再也不怕面试官了
- 软件架构设计分层模型和构图思考
- 细数软件架构中的解耦
- Netflix如何实现Android与 iOS共用一套代码?
- Linux主流架构运维工作简单剖析
- 一文看懂微服务架构之注册中心Consul、Nacos
- 程序员也需了解的主流云计算网络架构
- 数据中台到底包括什么内容?一文详解架构设计与组成
