ViewModel + Data Binding中的最佳实践和模式.ViewModel中的ObservableField好吗?

Vad*_*ovs 4 android design-patterns android-databinding android-mvvm android-architecture-components

通过示例,我看到了两种使用Android架构组件的MVVM方法.

第一种方法:

  1. ViewModel 提供 LiveData
  2. Activity 订阅 LiveData
  3. 当被叫观察者Activity正在设置数据时ViewModel ObservableField.
  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}">
    
    Run Code Online (Sandbox Code Playgroud)

优点:我并不需要通过状态(例如"加载"),因为我更新listLoading ObservableFieldViewModel为这样的:

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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

缺点:这种方法有任何缺点吗?

第二种方法:

  1. ViewModel 提供 LiveData
  2. Activity 订阅 LiveData
  3. 当被调用的观察者Activity被传递给绑定时
  4. 只有需要的对象(pojo)被传递给绑定

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

缺点:国家应归还ViewModel.在此示例中,Google数据被包装在Resource对象中.

第一种方法用于Google的另一个示例应用

我想知道具有使用Android数据绑定和Android Arch Components的更多经验的开发人员的两种模式的优缺点.

Ema*_*l S 6

您应该考虑使用业务逻辑拆分视图逻辑.

由于您有一个使用数据绑定和AAC处理的ViewModel,您还应该在视图(布局)中分离逻辑.

只需将两个变量传递给您的布局.一个是VievModel,它处理业务逻辑,如按下按钮和处理逻辑,第二个是View(片段).

之后你可以使用

app:onRefreshListener="@{() -> yourViewFragment.refreshList()}"
Run Code Online (Sandbox Code Playgroud)

如果当前没有订阅视图,请避免出现"上下文泄漏"或无法解决的问题.

由于onRefreshListener绑定到一个片段,因此可以在片段内传递它.

您需要在ViewModel中创建一个LiveData或ObservableField来处理这种操作,因为如果您暂停并恢复该片段,您将再次观察LiveData.这也意味着您将再次获得最后的数据.

可以在ViewModel中使用的示例:

<Textview ... name="@{viewModel.dataOfYourModel}" onClick="@{viewModel.doNetworkCall}" />
Run Code Online (Sandbox Code Playgroud)

黄金法则:每个以android.*开头的包/导入都不应该在viewmodel中,除了android.arch.*组件.