ViewModel +数据绑定中的最佳实践和模式。 ViewModel中的ObservableField是否正常?
翻阅样本,我看到了2种使用Android Architecture Components的MVVM方法。ViewModel +数据绑定中的最佳实践和模式。 ViewModel中的ObservableField是否正常?
第一种方法:
-
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}">
优点:我并不需要通过状态(例如 “加载”),正如我在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拱门组成的工作更多的经验,从开发模式两者的利弊。
您应该考虑将业务逻辑与视图逻辑分开。
既然你有一个ViewModel使用数据绑定和AAC来处理,你应该也分开你的视图(布局)内的逻辑。
只需将两个变量传递给您的布局即可。一个是处理业务逻辑的VievModel,像按下按钮并处理逻辑,第二个是视图(片段)。
后,您可以使用
app:onRefreshListener="@{() -> yourViewFragment.refreshList()}"
,并避免“上下文泄漏”或不工作解决办法,如果我们目前无法查看订阅。
由于onRefreshListener绑定到一个片段,所以它可以通过你的片段。
你很想在你的ViewModel中创建一个LiveData或ObservableField来处理这种操作,因为如果你暂停和恢复片段,你将再次观察LiveData。这也意味着你会再次获得最后的数据。
实例可以在视图模型中使用:
<Textview ... name="@{viewModel.dataOfYourModel}" onClick="@{viewModel.doNetworkCall}" />
黄金法则:每包/进口开始与Android *应不除android.arch的视图模型里面*组件。
关于这些问题的最后一句话?我想使用第二种方法,但仍然困惑。任何帮助? – iMDroid