前言
上上週進行了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類。