Todo-databinding 源码体验

大家好,我是苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表

相信有关注我的人,都会看过我第一编介绍的Todo-mvp源码体验,这是基础编。

这个系列的课程适合研发有Android有一年半左右的同学参考。

今天介绍第三编的todo-databinding是Todo-mvp的进阶编。

之前两编都是基于MVP的架构,而databinding是MVVM的架构,相信很多人都会看过mvvm的基础吧。


说一下简单的配置

Android Studio版本在1.3以上

gradle的版本要在1.5.0-alpha1以上

需要在Android SDK manager中下载Android Support repository

然后在对应的Module的build.gradle中添加


mvvm开关

然后介绍一些mvvm基础的源码


有兴趣的同学,可以自己深入查看一下。

一.页面的基础绑定介绍

当然还是要从基础开始说起的啦

我们以TaskFragment为例吧,查看一下tasks_frag.xml结构


tasks_frag.xml

查看一下它的结构

我们可以很容易看到其有两个变量一个是task,另一个是actionHandler。

task对应的type是TasksViewModel,其继承于BaseObservable,可以在之前说得源码目录找到这个代码,特别注意,如果是@Bindable的注释对应的是xml中的名称。


通过调用@{tasks.currentFilteringLabel}的标签完成双向的绑定的,其对应的是上面getCurrentFilteringLabel的方法,通过getXXX的方法来获取相应的值。


而actionHandler对应的TaskContact.Presenter


我们可以看到调用onClick的时候会调用到addNewTask的方法,完成操作方法调用的绑定。


如果方法需要传入参数也是非常简单的事情,只要再()->XX的()里面添加参数就可以了。

这里很巧妙的将数值和动作分别用一个model类和一个Presenter的类区分开来,有利于降低耦合。

那我们怎么知道我们用的是哪个TaskViewModel和Presenter的实例呢?

有get的方法,当然我们需要set的方法来设置实例,我们会在TasksFragment里面初始化的时候完成设置。


可以看到我们在这里可以设置相应的实例对象。

这里推荐一篇databinding运用入门的文章,里面详细介绍了如果运用databinding的文章

Android Data Binding 系列 (一) -- 详细介绍与使用

二.页面生成流程分析

如果你点击TasksFragBinding跳转会调转会tasks_frag.xml,你会不会觉得很奇怪?这个类是从哪里来的?

好了,这里要简单解析一下databinding的原理

build的intermediates有两个databinding编译生成的文件夹是data-binding-info和data-binding-layout-out


我们的tasks_frag.xml会转化为data-binding-layout-out的layout里面的tasks_frag.xml

我们可以看到这个xml里面会添加一些tag的标示来替换掉原来的引用mvvm的@{}的代码


tasks_frag.xml

而再进一步编译会生成data-binding-info的tasks_frag-layout.xml,在这里会有tasks_frag更详细的描述。

而TasksFragBinding真正的位置是存在这个路径下(需要编译一次才能看到这个文件)


TasksFragBinding路径

我们可以看清它继承于ViewDataBinding,初始化的时候会通过Binding读取bindings数组中的View完成绑定


初始化

我们可以看到调用inflate的方法最后还是通过bind的方法来初始化


bind

这个todo-databinding里面没有通过activity双向绑定,如果想了解更详细的话,网上也有很多资料。

三.ListView binding的说明

task_item里面的原理和上面所说的绑定是一样的


task_item.xml

关键在于TaskAdapter中getView里面绑定的设置。

可以看到判断view是否为null来或者绑定的,创建绑定是通过传入LayoutInflater来完成初始化。


TaskAdapter

而DataBinding.getBinding(view)来绑定tag的方式来做缓存。


这个例子只有listView的绑定,如果想参考recylerView的绑定方式,可以查看一 中提到的链接。

四.Model数据变化

我们很容易可以看到我们的Model是继承于BaseObservable。我们可以通过Observable的方式去通知UI数据已经改变了,当然了,官方为我们提供了更加简便的方式BaseObservable,我们的实体类只需要继承该类,稍做几个操作,就能轻松实现数据变化的通知

1.我们的实体类要继承BaseObservale类

2.在Getter上使用注解@Bindable


3.在Setter里调用方法notifyPropertyChanged

BR是编译阶段生成的一个类,功能与 R.java 类似,用@Bindable标记过 getter 方法会在 BR 中生成一个 entry。

当数据发生变化时需要调用notifyPropertyChanged(BR.firstName)通知系统BR.firstName这个 entry 的数据已经发生变化以更新UI。


BR

五.自定义属性

另一个通过SwipeRefreshLayout来刷新数据


在SwipeRefreshLayoutDatabinding通过BindingAdapter来指定("android:onRefresh")来传入参数

方法第一个参数是view,第二参数是TasksContract.Presenter来绑定触发的实例的事件绑定在一起。让loadTasks来获取数据。


具体的源码分析分析就到这里了。

如果想进一步了解databinding绑定时候的源码生成可以查看一下这篇文章

DataBinding学习笔记(一)源码分析

下一节

将会介绍todo-mvp-clean的源码分析,敬请期待!!!

我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习和架构思想的的交流。

群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值