通过查看示例,我发现了两种使用 Android 架构组件的 MVVM 方法。
第一种方法:
-
ViewModel
提供LiveData
-
Activity
订阅LiveData
- 当观察员打电话时
Activity
正在将数据设置为ViewModel
ObservableField
.
- Whole
ViewModel
被传递给绑定。
-
In 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}">
Pros:我更新时不需要传递状态(例如“正在加载”)listLoading
ObservableField
in 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)
}
}
Cons:这种方法有什么缺点吗?
第二种方法:
-
ViewModel
提供LiveData
-
Activity
订阅LiveData
- 当观察员打电话时
Activity
被传递给绑定
- 仅将需要的对象(pojo)传递给绑定
Pros:这种方法有什么优点吗?
Cons:状态应从返回ViewModel
。在这个来自谷歌的样本 https://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample数据被包裹在Resource
object.
第一种方法用于来自 Google 的另一个示例应用程序 https://github.com/googlesamples/android-architecture/tree/dev-todo-mvvm-live-kotlin/
我想从具有更多 Android 数据绑定和 Android Arch 组件使用经验的开发人员那里了解这两种模式的优缺点。
您应该考虑将视图逻辑与业务逻辑分开。
由于您有一个使用数据绑定和 AAC 来处理的 ViewModel,因此您还应该分离视图(布局)内的逻辑。
只需将两个变量传递给您的布局即可。第一个是 ViewModel,它处理业务逻辑,例如按下按钮并处理逻辑,第二个是 View(片段)。
之后您可以使用
app:onRefreshListener="@{() -> yourViewFragment.refreshList()}"
如果当前没有订阅视图,则避免出现“上下文泄漏”或无效的解决方案。
由于 onRefreshListener 绑定到片段,因此可以将其传递到片段内。
您不应该在 ViewModel 中创建 LiveData 或 ObservableField 来处理此类操作,因为如果您暂停并恢复片段,您将再次观察 LiveData。这也意味着您将再次获得最后传送的数据。
可以在 ViewModel 中使用的示例:
<Textview ... name="@{viewModel.dataOfYourModel}" onClick="@{viewModel.doNetworkCall}" />
黄金法则:除了 android.arch.* 组件之外,以 android.* 开头的每个包/导入都不应位于视图模型内。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)