前言
上上周进行了DataBinding原理分析,但是并没有对DataBinding如何生成文件进行研究。
如何生成文件,当然也利用了apt(annotation-processing-tool),apt在很多三方框架中都有使用,例如:ButterKnife,Arouter,EventBus等等。这里就不介绍了,推荐一个github上的demo–DemoAbstractProcessor。
正文
本文主要想讨论的是DataBinding生成文件的时机。
在印象里,我只要做如下操作,以下都称为操作A:
给一个Activity的xml设置了DataBinding的layout标签,然后用Activity去绑定这个xml。
就可以引用到了对应的DataBinding类,这里创建的Activity是TestActivity,对应地可以引用到ActivityTestBinding。
在这里我是存疑的,因为如果是通过apt技术的话,意味着我在做完操作A的时候,AS自动去捕捉了操作A,然后进行了编译,之后我才能引用到对应的DataBinding类。
那什么时候AS自动进行了编译,去生成文件呢?我测试了很久,发现,如果我只是进行操作A,gradle并没有执行编译操作,当然没有生成任何新的文件。
然后我Make project
之后,发现生成了各种DataBinding相关文件,当然包括ActivityTestBinding。
然后我突然想到有时候我完成操作A的时候,并不能成功去引用DataBinding类。
这里我就有了一个猜想:AS在我做完操作A时,在它的缓存里存储了一个标志符名字就叫ActivityTestBinding,并且在我点击import com.example.tsnt.databinding.ActivityTestBinding;
中的ActivityTestBinding时就自动跳转到了对应的xml文件–activity_test。大多数情况是这样的,但有时候并没有成功添加缓存,所以我们引用不到ActivityTestBinding。
然而即使在编译之后,真正生成了ActivityTestBinding类,我们点击import com.example.tsnt.databinding.ActivityTestBinding;
中的ActivityTestBinding时还是自动跳转到了对应的xml文件–activity_test,并没有跳转到ActivityTestBinding类。这样做的原因我觉得可能是,隐藏了DataBinding的实现细节更加便于我们的开发,因为大多数情况下我们不用去关心生成的DataBinding类,我们只要知道Activity通过DataBinding成功绑定了xml就可以了。
其实有时候是可以点击import com.example.tsnt.databinding.ActivityTestBinding;
中的ActivityTestBinding跳转到ActivityTestBinding类的,这是什么时候呢?就是AS的缓存没生成成功,ActivityTestBinding类又真实存在的时候。
总结
我又进行了一些测试,最后做出如下总结:
生成的DataBinding类名字是和xml相关的,和Activity无关,xml叫activity_test,DataBinding类就叫TestActivityBinding。具体生成名字的规则请自行查看ProcessDataBinding的源码。
正常情况下,我们给一个xml正确设置layout标签,并且写一个根布局或者有id的View或者绑定ViewModel属性的View时,AS自动创建一个对应DataBinding类的标志符。
在编译之后,通过apt,真正的DataBinding类和其他相关文件才会生成。
正常情况下,我们点击
import com.example.tsnt.databinding.ActivityTestBinding;
中的ActivityTestBinding跳转到的都是对应的xml文件activity_test,是DataBinding 对使用者隐藏了实现细节,便于使用者进行开发。在缓存没有成功生成的时候,如果ActivityTestBinding类又真实存在的时候,我们点击
import com.example.tsnt.databinding.ActivityTestBinding;
中的ActivityTestBinding跳转到的才是真正的ActivityTestBinding类。