DataBinding生成文件的時機

前言

上上週進行了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類又真實存在的時候

總結

我又進行了一些測試,最後做出如下總結:

  1. 生成的DataBinding類名字是和xml相關的,和Activity無關,xml叫activity_test,DataBinding類就叫TestActivityBinding。具體生成名字的規則請自行查看ProcessDataBinding的源碼。

  2. 正常情況下,我們給一個xml正確設置layout標籤,並且寫一個根佈局或者有id的View或者綁定ViewModel屬性的View時,AS自動創建一個對應DataBinding類的標誌符。

  3. 在編譯之後,通過apt,真正的DataBinding類和其他相關文件纔會生成。

  4. 正常情況下,我們點擊import com.example.tsnt.databinding.ActivityTestBinding;中的ActivityTestBinding跳轉到的都是對應的xml文件activity_test,是DataBinding 對使用者隱藏了實現細節,便於使用者進行開發

  5. 在緩存沒有成功生成的時候,如果ActivityTestBinding類又真實存在的時候,我們點擊import com.example.tsnt.databinding.ActivityTestBinding;中的ActivityTestBinding跳轉到的纔是真正的ActivityTestBinding類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章