2

翻阅样本,我看到了2种使用Android Architecture Components的MVVM方法。ViewModel +数据绑定中的最佳实践和模式。 ViewModel中的ObservableField是否正常?

第一种方法:

  1. ViewModel提供LiveData
  2. Activity订阅了LiveData
  3. 当观察者称为Activity是设置数据到ViewModelObservableField
  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}"> 
    

优点:我并不需要通过状态(例如 “加载”),正如我在ViewModel更新listLoadingObservableField为这样的:

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) 
     } 
    } 

缺点:这种方法有什么缺点吗?

第二种方法:

  1. ViewModel提供LiveData
  2. Activity订阅了LiveData
  3. 当观察者称为Activity被传递到结合
  4. 仅需要对象(PO​​JO)被传递到结合

优点:这种方法的任何优点?

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

第一种方法是使用在another sample app from Google

我想知道什么是与Android的数据绑定和Android拱门组成的工作更多的经验,从开发模式两者的利弊。

+0

关于这些问题的最后一句话?我想使用第二种方法,但仍然困惑。任何帮助? – iMDroid

回答

4

您应该考虑将业务逻辑与视图逻辑分开。

既然你有一个ViewModel使用数据绑定和AAC来处理,你应该也分开你的视图(布局)内的逻辑。

只需将两个变量传递给您的布局即可。一个是处理业务逻辑的VievModel,像按下按钮并处理逻辑,第二个是视图(片段)。

后,您可以使用

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

,并避免“上下文泄漏”或不工作解决办法,如果我们目前无法查看订阅。

由于onRefreshListener绑定到一个片段,所以它可以通过你的片段。

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

实例可以在视图模型中使用:

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

黄金法则:每包/进口开始与Android *应不除android.arch的视图模型里面*组件。