当前位置: 首页 > news >正文

深圳市建设厅官方网站网站建设预付

深圳市建设厅官方网站,网站建设预付,手机百度建设网站,楚雄做网站的公司目录 一、DataBinding简介二、findViewById 和 DataBinding 原理及优缺点1. findViewById的优缺点2. DataBinding的优缺点 三、Android mvvm 之 databinding 原理1. 简介和三个主要的实体DataViewViewDataBinding 2.三个功能2.1. rebind 行为2.2 observe data 行为2.3 observe … 目录 一、DataBinding简介二、findViewById 和 DataBinding 原理及优缺点1. findViewById的优缺点2. DataBinding的优缺点 三、Android mvvm 之 databinding 原理1. 简介和三个主要的实体DataViewViewDataBinding 2.三个功能2.1. rebind 行为2.2 observe data 行为2.3 observe view 行为 四、代码实例 一、DataBinding简介 DataBinding 是谷歌官方发布的一个框架顾名思义即为数据绑定是 MVVM 模式在 Android 上的一种实现用于降低布局和逻辑的耦合性使代码逻辑更加清晰。MVVM 相对于 MVP其实就是将 Presenter 层替换成了 ViewModel 层。DataBinding 能够省去我们一直以来的 findViewById() 步骤大量减少 Activity 内的代码数据能够单向或双向绑定到 layout 文件中有助于防止内存泄漏而且能自动进行空检测以避免空指针异常 二、findViewById 和 DataBinding 原理及优缺点 1. findViewById的优缺点 findViewById的原理Android中的View结构是一个树形结构findViewById就是自树的根节点依次遍历其子节点知道找到目标的id。 findViewById的优点 兼容性好下面各种替代方案都有其适用的场景但是findViewById适用所有的场景当你不知道用哪种方案的时候那就用findViewById吧肯定没有错。非常灵活适合动态加载layout文件。比如一个Activity需要在不同的业务中加载两个不同的layout文件但是两个layout文件只有部分间距不同其他各个元素都是相同的。这个时候用findViewId就可以完美适用。 findViewById的缺点 性能略差不好findViewById是基于树形结构的查找理论上会带来性能的额外开销但是实际项目中因为控件的个数也不会非常非常多所以可以忽略不计。Fragment中使用容易犯错。从原理图可以看到在Activity中调用findViewById实际上是调用Window中的findViewById但是Fragment中并没有单独的WindowFragment中调用findViewById的效果和Activity中调用的效果一模一样。所以如果一个Activity中有多个FragmentFragment中的控件名称又有重复的那直接findViewById会出错的增加代码的耦合度findViewById随时实地都可以调用在子view中在Activity中等等如果滥用起来会让代码耦合的一塌糊涂后面查找bug起来非常麻烦因为不知道View的属性在哪个类中被改变了容易引发空指针一个大型项目中控件的id经常会重复xml中删除了一个控件但是对应的Activity中没有删除这个控件的相关引用编译时并不会报错但是运营室时会报出空指针代码可读性不好findViewById往往在Activity的onCreate方法中被引用我们不能方便的将xml中的控件与代码中的控件结合起来特别是如果xml的命名与代码中的命名又不规范代码阅读起来简直就是噩梦。 2. DataBinding的优缺点 databinding会根据动态生成一个ActivityMainBinding文件在执行ActivityMainBinding.inflate的时候会自动生成控件的引用mapBindings方法这里对布局tree执行一趟遍历查找就可以生成所有的引用 DataBinding的优点 规避了控件空指针错误如果有引用错误则会在编译阶段发现效率比findViewById要高一趟遍历可以生成所有控件的引用而findViewById是每次执行时都需要遍历一遍代码的可读性要高得益于Android Studio的强大功能我们很轻易的将javakotlin代码中的控件引用与xml的定义结合起来 DataBinding的缺点 灵活性不高如果需要动态选取引用的布局文件binding就无法适用了。改造成本较大布局文件只有加上layout标签才可以使用。 原文链接 参考博客 三、Android mvvm 之 databinding 原理 原文 1. 简介和三个主要的实体 Data Binding 的结构[Top] 作为在 Android 开发中体现 MVVM 架构思想的 Data Binding其核心是 观察者模式 的特定实现。首先它有三个主要的实体 Data 与 View 相关的数据它可以是 View 的可观察者对象 View 展示给用户的视图如果有交互功能且能更新数据它可以是 Data 的可观察者对象 ViewDataBinding 连接 Data 和 View 的中介当 Data 或 View 作为可观察者对象时它充当可观察者对象的代理。假如当我们写了一个名为 demo.xml 的 Data Binding 的 layout 文件后编译工具会生成一个相应的类——DemoBinding它的原型就是 ViewDataBinding。我们通常通过 DataBindingUtil.inflate(inflater, R.layout.demo, container, false) 来实例化的 DemoBinding 对象即 ViewDataBinding。 2.三个功能 其次它主要提供了以下三个方面的功能 将特定的 View 与特定的 Data 进行绑定便于模块化 View 自动感知和响应 Data 的变化使得处理数据的业务层不必关心 View 的状态便于解耦 Data 也可以自动同步带有交互功能的 View 对数据的修改使得 UI 层的交互不必担心数据是否能同步 View 状态的问题仍然便于解耦。 基于这三个功能Data Binding 的结构也可以划分为三个行为模式以下一一介绍 2.1. rebind 行为 首先Data 往往是一个数据的集合数据绑定的第一步就是要将整个 Data 集合绑定到 View比如初始化和数据的整体更新如下图所示 可以观察到rebind 的过程就是一个简单的赋值操作将 View 的值设置为 Data只不过由 ViewDataBinding 这个代理来完成这个工作。图中的 _all 参数表示将 View 的所有需要更新的节点都设置为 Data 的所有对应的成员值。当我们在 layout 文件中进行如下设置时ViewDataBinding 将代理完成 View 中所有数据绑定节点的 data rebind 操作 2.2 observe data 行为 有时候我们并不需要每次更新整个 Data 集合而只需要更新集合中的某一个成员。我们希望看到的结果是当 Data.element_i 发生变化的时候View.child_i 更新就可以了而不需要将 View 的所有视图节点都重新渲染一遍。要做到这一点我们必须要让 View 可以观察 Data 的行为。换句话说Data 是一个可观察者对象——这是 Data Binding 中另一个魅力所在其行为模式如下 我们可以将任何数据作为一个 Observable然后将 ViewDataBinding 作为 View 的代理观察者订阅 Data 的成员变化一旦 Data 成员变化便通知所有观察者对象——即 ViewDataBinding然后 ViewDataBinding 再将 View 的相应节点的值设置为 Data 相应成员的新值——即图中的 _member 参数。 这里有三个关键部分 BaseObservable可观察者基类实际的祖先基类是一个 Observable 接口实现改接口后ViewDataBinding 就会在每次 rebind 的时候去订阅 Data 的变化 Bindable 标注声明该成员是可被观察的以及在 layout 中可以以 http://Data.xxx标注的方法名如果为 getXXX的方式进行访问 notifyPropertyChanged 方法BaseObservable 用于通知具体成员发送变化的方法只要该方法被调用ViewDataBinding 就会检索出是哪一个 element 的变化并只对 View 相应的节点进行更新。 2.3 observe view 行为 在开发中根据业务需求我们一般能遇到两种类型的 View 一种是只用于展示的 View它只展示 UI 状态而不反馈状态我们称之为 单工View 另一种除了展示以外还会反馈状态给监听者我们称之为 双工View。 在 Android 的 UI事件流中因为所有的 View 都是可以反馈状态的所以准确来说所有的 View 其实都是双工的。我们在这里区分单工和双工是针对业务需求的比如我们很多的视图只需要它们展示就可以了不需要监听它们的状态变化那么我们将其归为单工View。 费尽心思进行这样的划分是因为单工View 只需要有 observe data 行为就可以了而双工View 往往就需要 observe view 行为。具体来说在反馈状态时需要更新 Data 的双工 View我们需要进行 observe view 行为。 因为双工View 会更新 Data所以为了保证数据的一致性Data 需要观察双工View 的状态变化。要做到这一点这样的双工View 必须是一个可观察者对象。得益于 UI事件流的实现双工View天然是可观察的只要能反馈状态就意味着能被观察。在自定义的双工View中可以间接引用 ViewDataBinding这样 ViewDataBinding 就可以代理 Data 订阅 View 的状态变化 四、代码实例 启用 DataBinding 的方法是在对应 Model :app的 build.gradle 文件里加入以下代码同步后就能引入对 DataBinding 的支持 android {dataBinding {enabled true} }1、在布局文件中绑定指定的变量打开布局文件选中布局文件的第一行按住 Alt 回车键点击 “Convert to data binding layout”就可以生成 DataBinding 需要的布局规则 和原始布局的区别在于多出了一个 layout 标签将原布局包裹了起来data 标签用于声明要用到的变量以及变量类型要实现 MVVM 的 ViewModel 就需要把数据Person与 UIView进行绑定data 标签的作用就像一个桥梁搭建了 View 和 Person 之间的通道 Person类 public class Person {private String name;private int age;public Person(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;} }在 data 标签里声明要使用到的变量名、类的全路径如果 Person类型要多处用到也可以直接将之 import 进来就不用每次都指明整个包名路径 datavariablenameper1typecom.example.databindingpro.Person /variablenameworktypeString //data如果存在 import 的类名相同的情况可以使用 alias 指定别名 dataimport typecom.leavesc.databinding_demo.model.User /importaliasTempUsertypecom.leavesc.databinding_demo.model2.User /variablenameuserInfotypeUser /variablenametempUserInfotypeTempUser //data这里声明了一个 Person类型的变量per1我们要做的就是使这个变量与两个 TextView 控件挂钩通过设置per1的变量值同时使 TextView 显示相应的文本 完整的布局代码如下所示 ?xml version1.0 encodingutf-8? layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsxmlns:apphttp://schemas.android.com/apk/res-autodatavariablenameper1typecom.example.databindingpro.Person /variablenameworktypeString //dataLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationverticalTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{per1.name}android:textSize30dp/TextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{String.valueOf(per1.age)}android:textSize30dp/TextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{work}android:textSize30dp//LinearLayout/LinearLayout /layout通过 {per1.name}使 TextView 引用到相关的变量DataBinding 会将之映射到相应的 getter 方法 之后可以在 Activity 中通过 DataBindingUtil 设置布局文件省略原先 Activity 的 setContentView() 方法并为变量per1 赋值 import androidx.databinding.DataBindingUtil; import android.app.Activity; import android.os.Bundle; import com.example.databindingpro.databinding.ActivityMainBinding; public class MainActivity extends Activity {private ActivityMainBinding mActivityMainBinding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);mActivityMainBinding DataBindingUtil.setContentView(this,R.layout.activity_main);com.example.databindingpro.Person person new com.example.databindingpro.Person(张三,23);mActivityMainBinding.setPer1(person);//给布局文件nameper1传入数据,类型为Person对象mActivityMainBinding.setWork(Teacher);//给布局文件namework传入数据类型为String字符串} }效果
http://www.pierceye.com/news/460254/

相关文章:

  • 如何做网站管理网站服务器基本配置
  • 做网站需要参考书目书龙岩营销型网站建设
  • 南通网站建设解决方案求助如何做网站推广
  • 揭阳企业做网站淮安做网站
  • 怎么给餐饮店做网站用织梦做企业网站
  • 技术支持 创思佳网站建设如何制作自己的网站
  • 济南网站建设公司晟创未来wordpress xml插件
  • 前端做商城网站需要多久实训课网站开发个人小结
  • 南宁网站seo排名优化手机网站制作架构
  • 亿唐网不做网站做品牌案例分析seo 推广服务
  • 深圳网站建设服务器如何编写一份网站开发需求文档
  • 营销网站策划wordpress主题在线汉化插件下载
  • 深圳市网站开发个人养老保险金怎么交
  • 超炫html5网站模板新手做网站怎么上传系统
  • 一个网站的二级目录在另一台服务器上_怎么做网络营销工程师前景
  • 个人网站推广软件企业网站建设变相收取等级保护费6
  • 有没有一些网站可以做问卷个人网站 服务器
  • 网站前端WordPress怎么自定义页眉
  • 常州企业免费建站秦皇岛市住房公积金管理中心
  • 网站建设网站需要什么软件有哪些使用wordpress开发一个页面
  • 贵溪市城乡建设局网站手机网站推荐
  • wordpress多站点的路径深圳龙岗区宝龙街道
  • 做外贸免费发布产品的网站装修软件app哪个好
  • 网站注册系统医疗器械分类目录2021
  • 珠海建设网站百度收录有什么好处
  • 二手网站专业做附近人的有吗免费申请网站永久
  • 校园二手市场网站开发网站文章优化流程方案
  • 手机网站的必要性衡水网站设计费用
  • 厦门市建设安全管理协会网站网站登录模板下载
  • 江苏启安建设集团有限公司网站wordpress图标字体不显示不出来