返回
Android架构:ViewModel与View的巧妙交互
Android
2023-09-15 01:32:46
Android架构:ViewModel与View的巧妙交互
自Google在I/O大会上首次发布架构组件以来,MVVM架构引发了网络上的广泛热议。许多钟爱Presenters的开发者已逐渐接受ViewModel的世界。ViewModel可有效减少样板代码,管理配置更改期间的数据,同时方便跨多个片段共享数据。然而,ViewModel与View之间的交互还有待商榷。
ViewModel与View通信的桥梁
ViewModel作为数据持有者,与UI保持分离。因此,为了使ViewModel与View有效通信,我们需要一座桥梁。这一桥梁由以下几个关键组件构成:
- DataBinding: 数据绑定提供了双向数据绑定,允许ViewModel的更改自动反映在View上,反之亦然。
- ObservableFields: 可观察字段是LiveData的变种,当其值发生变化时,可通知观察者。ViewModel使用可观察字段公开其数据,以便View可以订阅这些字段。
- EventHandlers: 事件处理程序是无状态方法,允许View响应用户交互并触发ViewModel中的操作。
数据流向
数据在ViewModel与View之间的流向遵循以下模式:
- ViewModel通知View: ViewModel中的可观察字段更改时,数据绑定会自动更新View。
- View通知ViewModel: 当用户与View交互时,事件处理程序会触发ViewModel中的操作。ViewModel随后更新其可观察字段,从而通过数据绑定更新View。
单向数据流与不可变性
MVVM架构强调单向数据流和不可变性原则。这意味着数据只从ViewModel流向View,ViewModel中的数据也不应直接修改。取而代之的是,ViewModel应创建新实例或使用可变集合的副本。这有助于确保ViewModel状态的可预测性和可测试性。
实践中的ViewModel-View交互
以下代码示例展示了ViewModel与View之间的典型交互:
ViewModel:
public class MyViewModel extends ViewModel {
private ObservableField<String> name = new ObservableField<>();
public ObservableField<String> getName() {
return name;
}
public void onNameChanged(String newName) {
name.set(newName);
}
}
View:
<layout>
<data>
<variable
name="viewModel"
type="com.example.myapplication.MyViewModel" />
</data>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.name}"
android:onTextChanged="@{(s, start, before, count) -> viewModel.onNameChanged(s)}" />
</layout>
结论
ViewModel与View之间的通信是MVVM架构的关键方面。通过使用数据绑定、可观察字段和事件处理程序,我们可以建立一种双向通信机制,同时保持单向数据流和不可变性原则。这有助于创建可维护、可测试且可重用的Android应用程序。