Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewModel和x2B中的最佳实践和模式;数据绑定。ViewModel中的ObservableField是否正常?_Android_Design Patterns_Android Databinding_Android Architecture Components_Android Mvvm - Fatal编程技术网

Android ViewModel和x2B中的最佳实践和模式;数据绑定。ViewModel中的ObservableField是否正常?

Android ViewModel和x2B中的最佳实践和模式;数据绑定。ViewModel中的ObservableField是否正常?,android,design-patterns,android-databinding,android-architecture-components,android-mvvm,Android,Design Patterns,Android Databinding,Android Architecture Components,Android Mvvm,通过查看示例,我看到了使用Android架构组件实现MVVM的两种方法 第一种方法: ViewModel提供LiveData Activity订阅LiveData 当名为“活动”的观察者将数据设置为“视图模型”时 整个ViewModel被传递到binding 在xml中,您只需将observefield设置为值 <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_conte

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

第一种方法:

  • ViewModel
    提供
    LiveData
  • Activity
    订阅
    LiveData
  • 当名为“活动”的观察者将数据设置为“视图模型”时
  • 整个
    ViewModel
    被传递到binding
  • xml
    中,您只需将
    observefield
    设置为值

    <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
    提供
    LiveData
  • Activity
    订阅
    LiveData
  • 当调用的观察器
    活动
    被传递给绑定时
  • 只将所需对象(pojo)传递给绑定
  • 优点:这种方法有什么优点吗

    缺点:状态应该从
    ViewModel
    返回。在这种情况下,数据被包装在
    资源
    对象中

    第一种方法用于


    <> P>我想知道,有更多经验的Android数据绑定和Android ARCH组件的开发者有哪些优点和缺点。

    你应该考虑用业务逻辑拆分视图逻辑。 因为您有一个使用数据绑定和AAC处理的ViewModel,所以您还应该分离视图(布局)中的逻辑

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

    之后你可以使用

    app:onRefreshListener="@{() -> yourViewFragment.refreshList()}"
    
    如果当前没有订阅视图,请避免出现“上下文泄漏”或不起作用的解决方案

    因为onRefreshListener绑定到一个片段,所以可以在片段中传递它

    您不应该在ViewModel内创建LiveData或ObservableField来处理此类操作,因为如果暂停并恢复片段,您将再次观察LiveData。这也意味着您将再次获得最后一次交付的数据

    可在ViewModel中使用的示例:

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

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

    关于这些问题有什么定论吗?我想使用第二种方法,但仍然感到困惑。有什么帮助吗??
    <Textview ... name="@{viewModel.dataOfYourModel}" onClick="@{viewModel.doNetworkCall}" />