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的視圖模型裏面*組件。