1. 程式人生 > >從例項出發理解Dagger2(一)

從例項出發理解Dagger2(一)

看了很多Dagger2的文章,感覺道理好像明白了,但是真的到用的時候仍然有點萌萌的,哦,不,懵懵的。完全不知道從哪裡下手,真系樣銀感到絕望啊。由此打算寫一個從例項出發,從沒有Dagger2的程式碼到一點一點帶入Dagger2,希望這樣可以幫助理解Dagger2。

在看這篇文章之前,希望大家對Dagger2有一個基本的瞭解。這樣看起來更有助於理解記憶。如果還不熟悉Dagger2的推薦大家看這篇文章:
Android:dagger2讓你愛不釋手-基礎依賴注入框架篇—牛曉偉

Dagger2 is really just an annotation processor,it’s just a code generator.


Dagger2只是一個註解處理器,用於幫助生成程式碼。 所以先拋開之前看到的依賴注入的相關概念,認識Dagger2的本質。

看完了上面這句話,就讓我們把例子舉起來吧。

通常我們在構建App的時候會用到很多的庫,包括網路(Retrofit/OKHttp)、圖片請求(Picasso)、資料解析(Gson)等,通常我們會在Application中初始化這些庫。而且這些庫之間本身就會有相互的依賴,比如Retrofit依賴OKHttp,Picasso也可以使用OKHttp傳輸圖片資料,OKHttp依賴HttpLoggingInterceptor攔截網路請求,日誌的列印依賴Timber等。這樣一路下來有不少初始化的程式碼要去寫。如圖所示:
Application初始化.png

這還只是一些基礎庫的初始化程式碼,如果專案稍微複雜點,Application裡初始化程式碼多到讓人頭暈,甚至影響分析Application裡的邏輯。

現在我們需要寫一個展示GitHub使用者Feed流資訊的頁面,長這樣吧:
image.png

這裡面需要用到ListView展示這些資訊。這裡面每一個Item叫RepoListItemRepoListItem中需要使用Picasso載入圖片,那麼可以這麼寫程式碼:

image.png

注意啦,這裡就會有對Picasso的依賴了(Picasso.with(getContext()))。 這樣是不利於我們後續的測試工作的,最好這個Picasso是由構造器傳入的。那麼就在構造這個類的時候傳入一個Picasso物件。在構造這個類的時候需要一個Picasso 類,這就導致了對Picasso的依賴,而提供這種依賴的方法就是依賴注入。通過構造器傳入物件也是一種注入依賴的方法,由此可見依賴注入並沒有想象的那麼神祕。程式碼如下:
image.png


那麼我們在ListView的Adapter中構造這個Item 的時候就需要傳入一個Picasso物件。這樣不可避免的也就要在構造這個Adapter的時候傳入一個Picasso物件。
image.png

這樣在Activity中構造Adapter的時候就需要傳入Picasso物件,由於Picasso在Application中已經建立好,所以直接從Application中獲取就好。通過網路獲取資料後就能在介面上展示了:
image.png

好了讓我們來分析一下現在形成的依賴關係把。
image.png

這僅僅是一個簡單的頁面展示,就會涉及到這麼多依賴的類,想想複雜得多的頁面邏輯,new了50多個的物件,看著堆積成山的程式碼不禁有點無奈 。這時候就要用到Dagger2解決的問題,Dagger2能夠把我們從枯燥的初始化類的工作中解放出來 ,專注業務邏輯,同時保持程式碼的整潔。 Dagger能夠生成這些程式碼,只需要我們告訴他如何建立一個類,如何找到各個類之間的依賴關係(例如OKHttp和Retrofit之間的關係)。

其實上面的介紹就是想粗略的表述一下依賴注入的概念和使用Dagger的必要性。下一篇文章會講解如何在Application中使用Dagger2逐個改變各個類庫的初始化程式碼。