Todo-databinding 源碼體驗

你們好,我是蒼王。
java

如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。android

[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表數組

相信有關注個人人,都會看過我第一編介紹的Todo-mvp源碼體驗,這是基礎編。緩存

這個系列的課程適合研發有Android有一年半左右的同窗參考。架構

今天介紹第三編的todo-databinding是Todo-mvp的進階編。app

以前兩編都是基於MVP的架構,而databinding是MVVM的架構,相信不少人都會看過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,也能夠掃碼進羣。我在這裏期待大家的加入!!!

相關文章
相關標籤/搜索