返回

Android架构:ViewModel与View的巧妙交互

Android

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之间的流向遵循以下模式:

  1. ViewModel通知View: ViewModel中的可观察字段更改时,数据绑定会自动更新View。
  2. 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应用程序。