【发布时间】:2017-10-11 19:34:34
【问题描述】:
通过示例,我看到了 2 种使用 Android 架构组件的 MVVM 方法。
第一种方法:
-
ViewModel提供LiveData -
Activity订阅LiveData - 当名为
Activity的观察者将数据设置为ViewModelObservableField。 - 整个
ViewModel被传递给绑定。 -
在
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}">
优点:我不需要传递状态(例如“正在加载”),因为我将 ViewModel 中的 listLoading ObservableField 更新为这样:
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提供LiveData -
Activity订阅LiveData - 当名为
Activity的观察者被传递给绑定时 - 只有需要的对象 (pojo) 被传递给绑定
优点:这种方法有什么优点吗?
缺点:应从ViewModel 返回状态。在这个sample from Google 中,数据被包装在Resource 对象中。
another sample app from Google使用第一种方法
我想向有更多使用 Android 数据绑定和 Android Arch 组件经验的开发人员了解这两种模式的优缺点。
【问题讨论】:
-
关于这些问题的任何最终结论?我想使用第二种方法,但仍然感到困惑。有什么帮助吗??
标签: android design-patterns android-databinding android-architecture-components android-mvvm