通过示例,我看到了 2 种使用 Android 架构组件的 MVVM 方法。
第一种方法:
ViewModel
提供LiveData
Activity
订阅LiveData
- 当被调用的观察者
Activity
将数据设置为ViewModel
ObservableField
. - 整体
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}">
优点:我不需要传递状态(例如“加载”),因为我更新listLoading
ObservableField
如下ViewModel
:
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
. 在这个来自 Google 的示例中,数据被包装在Resource
对象中。
第一种方法用于Google 的另一个示例应用程序
我想从有更多使用 Android 数据绑定和 Android Arch 组件经验的开发人员那里了解这两种模式的优缺点。