Todo-databinding 源码体验

大家好,我是苍王。

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

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

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

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

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

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

《Todo-databinding 源码体验》

说一下简单的配置

Android Studio版本在1.3以上

gradle的版本要在1.5.0-alpha1以上

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

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

《Todo-databinding 源码体验》

mvvm开关

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

《Todo-databinding 源码体验》

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

一.页面的基础绑定介绍

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

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

《Todo-databinding 源码体验》

tasks_frag.xml

查看一下它的结构

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

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

《Todo-databinding 源码体验》

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

《Todo-databinding 源码体验》

而actionHandler对应的TaskContact.Presenter

《Todo-databinding 源码体验》

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

《Todo-databinding 源码体验》

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

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

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

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

《Todo-databinding 源码体验》

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

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

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

二.页面生成流程分析

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

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

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

《Todo-databinding 源码体验》

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

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

《Todo-databinding 源码体验》

tasks_frag.xml

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

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

《Todo-databinding 源码体验》

TasksFragBinding路径

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

《Todo-databinding 源码体验》

初始化

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

《Todo-databinding 源码体验》

bind

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

三.ListView binding的说明

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

《Todo-databinding 源码体验》

task_item.xml

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

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

《Todo-databinding 源码体验》

TaskAdapter

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

《Todo-databinding 源码体验》

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

四.Model数据变化

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

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

2.在Getter上使用注解@Bindable

《Todo-databinding 源码体验》

3.在Setter里调用方法notifyPropertyChanged

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

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

《Todo-databinding 源码体验》

BR

五.自定义属性

另一个通过SwipeRefreshLayout来刷新数据

《Todo-databinding 源码体验》

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

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

《Todo-databinding 源码体验》

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

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

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

下一节

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

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

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

《Todo-databinding 源码体验》

    原文作者:Android源码分析
    原文地址: https://juejin.im/post/589bd3465c497d00561a139d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞