ViewModel + Data Binding中的最佳实践和模式。 ViewModel中的ObservableField好吗?

时间:2017-10-11 19:34:35

标签: android design-patterns android-databinding android-architecture-components android-mvvm

通过示例,我看到了两种使用Android架构组件的MVVM方法。

第一种方法:

  1. ViewModel提供LiveData
  2. Activity订阅了LiveData
  3. 当被叫Activity的观察者将数据设置为ViewModel ObservableField时。
  4. 整个ViewModel传递给绑定。
  5. xml中,您只需将ObservableField设为值

    即可
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        app:visibleGone="@{viewmodel.listLoading}"/>
    
    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swiperefresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:refreshing="@{viewmodel.listRefreshing}"
        app:onRefreshListener="@{() -> viewmodel.refreshList()}"
        app:visibleGone="@{!viewmodel.listLoading}">
    
  6. 优点:我不需要传递状态(例如&#34;正在加载&#34;),因为我更新了listLoading ObservableField { {1}}如下:

    ViewModel

    缺点:这种做法有没有缺点?

    第二种方法:

    1. val listLoading = ObservableBoolean(false) /** other observable fields go here **/ val list: MutableLiveData<List<Item>> = MutableLiveData() fun loadList() { listLoading.set(true) repo.getList { items -> list.value = items listLoading.set(false) } } 提供ViewModel
    2. LiveData订阅了Activity
    3. 当名为LiveData的观察者传递给绑定
    4. 只将所需对象(pojo)传递给绑定
    5. 优点:这种做法的任何优点?

      缺点:状态应从Activity返回。在此sample from Google数据中包含在ViewModel对象中。

      第一种方法用于another sample app from Google

      我想知道具有使用Android数据绑定和Android Arch Components的经验的开发人员的两种模式的优缺点。

1 个答案:

答案 0 :(得分:5)

您应该考虑使用业务逻辑拆分视图逻辑。

由于您有一个使用数据绑定和AAC处理的ViewModel,您还应该在视图(布局)中分离逻辑。

只需将两个变量传递给您的布局。一个是VievModel,它处理业务逻辑,如按下按钮和处理逻辑,第二个是View(片段)。

之后你可以使用

app:onRefreshListener="@{() -> yourViewFragment.refreshList()}"

如果当前没有订阅视图,请避免出现“上下文泄漏”或无效解决方案。

由于onRefreshListener绑定到一个片段,因此可以在片段内传递它。

您在ViewModel中创建一个LiveData或ObservableField来处理这种操作,因为如果您暂停并恢复该片段,您将再次观察LiveData。这也意味着您将再次获得最后的数据。

可以在ViewModel中使用的示例:

<Textview ... name="@{viewModel.dataOfYourModel}" onClick="@{viewModel.doNetworkCall}" />

黄金法则:每个以android。*开头的包/导入都不应该在viewmodel中,除了android.arch。*组件。