Android實戰——Dagger2一場老闆與員工的故事會

來源:互聯網
上載者:User

標籤:增加   contain   時間   dep   對象   多個   視覺   預設   項目   

本篇文章主要包含以下內容

  • 新的公司開張啦:前言
  • 新項目開會討論:Dagger2的介紹
  • 新員工入職(Hensen):Dagger2基本使用(@Component、@Inject、@Module、@Named)
  • 新員工入職(Jenny):Dagger2的模組化開發(@Module、@Singleton)
  • 老闆發火了(Boss):Dagger2的全域單例使用(@dependencies、@Scope)
  • 員工們都辭職了:源碼下載、結語

終於到了Hensen老師吹水的時間了,可能各位看慣了文字描述的Dagger2,看久了就會視覺疲勞,因為我也是這樣的過來的,所以今天換一種方式,編一個故事會的形式來讓觀眾們換換口味。Dagger2不是一般的難,而是很難,作為新手層級的Hensen老師只能為你們先去Dagger2探探險,一探就是好幾天,下面我就把探險的結果告訴大家

終於我們的公司開張啦,新公司命名就叫90後網路科技有限公司吧,下面是人物介紹

  1. Boss:老闆,大神層級的人物
  2. Hensen:元老級員工,負責項目的使用者模組
  3. Jenny:骨灰級員工,負責項目的網路模組

Boss:今天剛找到一個好項目,嘿嘿,融資了兩百萬,是時候招人進來把項目做出來啦,我該好好想想項目用什麼架構好呢。看最近Dagger2那麼火, 不如就它了

1、Dagger2的介紹

Dagger2是一款依賴注入架構,依賴注入架構對MVP架構來說,是最好的解耦工具,不僅為了讓你的代碼更有模組化,而且更有條理性

2、Dagger2的依賴

項目中使用到的依賴,如果你是Gradle2.2以下的,需要添加apt外掛程式等,這裡就不示範了,Gradle2.2是很久之前了,相信很多人都不用了

3、Dagger2的基本原理

這裡可以簡單的理解為多個模組(Module)通過Component直接注入到Activity中,我們可以把多個Module比喻為成為不同的針藥水,Component比喻為針管,Container比喻為屁股,我們通過不同針藥水混合後放入到針管,然後打到我們的屁股上,這就是Dagger2的基本原理

4、Dagger2的註解

這裡提前簡單的介紹我們需要用到的註解

  1. @Inject:通常在需要依賴的地方使用這個註解,也就是針水打進屁股的過程
  2. @Module:Modules類似於我們的模組,也就是成分不同的針藥水,提供各種執行個體和對象
  3. @Provides:在Modules中,我們定義的方法是用這個註解,以此來告訴Dagger2我們想要提供哪些執行個體和對象,也就是成為不同的針藥水的廠家
  4. @Component:注入器,是@Inject和@Module的橋樑,它的主要作用就是串連這兩個部分,也就是我們的針管+針頭
  5. @Scope:Dagger2使用的範圍,局部還是全域

5、Dagger2三步曲

  1. 建立Module,提供使用執行個體
  2. 建立Component,串連Module與Activity之間的橋樑
  3. Inject注入,開始在Activity中進行注入

Hensen:老闆好啊,今天很高興能來到90後網路科技有限公司,請問有什麼任務吩咐嗎?

Boss:來,把Dagger2作為我們新項目的架構,你負責使用者模組,今晚你就把它做完

Hensen:好的,老闆,我這就去工作了

Hensen習慣了MVC的架構模式,所以他一來就把MVC和Dagger2的框框先搭建了起來

1、主體邏輯:首先是定義幾個Controller來作為主要的功能邏輯

2、Module建立:剛學習完Dagger2的Hensen,知道Dagger2依賴注入的思路,就跟自己去打屁股針是一樣道理的,現在需要針藥水和針管針頭,來將藥水打入我們的屁股中,這裡的屁股就是Activity,即將Controller打入Activity中

3、Conmponet建立:準備好藥水,下面準備針管針頭

4、Inject的注入:這裡都準備好了,這時候千萬要注意記得Rebuild一下項目,它會產生我們需要的代碼,那麼就可以開始打針了

運行程式,控制台成功的列印出資訊

5、Named的使用:做到這裡,Hensen已經把大體的都做完了,剩下一個UserController 不知道怎麼下手,因為他有兩個構造方法,Dagger2會去預設會去調用哪個構造方法呢,於是Hensen又開始找資料了,他發現可以這麼做,他使用@Named方法,提供兩個不同構造方法

那麼在使用的時候的也要相對應相同的名字

運行程式,控制台列印出資訊

6、自訂Named的使用:Hensen是個追求完美的人,覺得程式還可以把這個Named再完善一下,於是它查看Named的源碼,照抄了一份作為自己的注釋

那麼使用起來看上去就很舒服了,效果和上面是一樣的,只不過換一種寫法

這樣就 沒問題了,Hensen的工作基本上已經完成了,下面就可以給老闆交付任務了

Jenny:老闆您好,我是Jenny,今天很高心來到公司,我個人比較擅長網路這塊,有什麼任務可以吩咐給我嗎?

Boss:這樣啊,那你寫個網路模組,讓Hensen的使用者管理連上網唄,對了最好用OkHttp

Jenny:恩,好的,老闆,那我先去工作了

由於Jenny的Dagger學得不好,所以只能去閱讀Hensen的代碼,然後根據意思類比出自己的一套Dagger出來

1、主體邏輯:首先是建立負責網路模組的主體邏輯,提供get和post的方法

2、Module的建立:這裡就是為Hensen準備好的Controller執行個體,直接把這個Module添加進去就能用

一開始不是很懂的Jenny,讓Hensen直接用自己的Module,它的意思如下面所示,可以直接把自己Module嵌入到Hensen中去,然而Hensen為了不得罪新同伴,就增加進去了,它知道這樣做不好,同時也勸Jenny把Component也寫出來

3、Componet的建立:讓這個模組注入到另一個Activity中,這裡得注意,如果其他Component使用的inject方法中也傳遞LoginActivity的話,這裡就會報錯,所以一個Componet能對應多個inject到Activity中,但是不能重複

4、模組使用:Hensen收到了Jenny做好的網路模組後,直接把它加入LoginActivity中就好啦,注意記得重新Rebuild一次才會產生對應的DaggerHttpComponet

5、Singleton的使用:Hensen作為老員工,知道OkHttp不能重複建立,讓Jenny把它進行單例,Jenny聽起來也時很有道理,於是就查資料,如何在Dagger2進行單例,它根據資料查到的方法如下,對Module中提供單例的方法中添加@Singleton字樣,然後對使用它的Componet添加@Singleton字樣即可,這樣就完成了

6、但是很快,Hensen又發現了令人頭疼的事情,由於UserActivity使用的是UserComponet、LoginActivity使用的是HttpComponet的,它們建立出來的HttpClient是不同對象。只有在同一個Componet中的Activity使用HttpClient才是單例。這是因為Singleton是跟Componet綁定在一起的,不同的Componet表示的肯定是不同的單例,所以沒辦法。Hensen是通過列印地址檢查出問題的

Boss:Jenny,你這個單例不能這樣子,在不同Componet會出現不同的單例,你得把它放到Application中去,這樣才是全域才是只有一個

Jenny:老闆,這。。我不會啊,怎麼辦?

Boss:哎,看來還是我得出場了

老闆也開始寫出了一套App層級的Dagger出來,並提供okHttp單例出來,大Boss來啦

1、Module的建立:老闆先從需求開始寫,需要什麼就給什麼,而且是@Singleton單例

2、Component的建立:老闆也懂得Dagger2,所以毫不猶豫進行第二步

3、Application建立:老闆深知只有在Application的變數才會整個程式被執行個體化一次,所以放在這裡的OkHttpClient全域是單例是完全沒錯的,注意記得重新Rebuild一次才會產生對應的DaggerAppComponet

當然,老闆怎麼可能犯小錯誤呢,記得在Application中註冊該MyApplication

4、Scope的建立:老闆親自寫了個Scope,跟我們說,以後就別用Singleton了,用我提供的ActivityScope,這樣單例才會生效。這裡是因為Singleton也是個Scope,Scope和Scope之間不能衝突,也就是老闆使用了Singleton,我們再使用就會報錯,我們必須使用老闆提供另外的ActivityScope才不會報錯

5、Jenny也偷偷的把自己提供的OkHttpClient注釋掉了,這裡這樣做為了後面的程式不報錯

6、dependencies的使用:老闆寫好了之後,我們就要開始使用老闆的,Hensen作為熟悉Dagger2的人,當然是先用為妙,下面是Hensen修改的內容,這裡需要注意要事先Rebuild一下老闆的模組,才能使用.appComponet(myApplication.getAppComponet())

7、不會Dagger2的Jenny也開始模仿Hensen的寫法,開始修改自己的代碼,下面是Jenny修改的代碼

8、Hensen順便也把Jenny寫的嵌入到自己的Activity中

9、最後Hensen通過列印資訊發現,老闆的確實是單例啊,終於解決了不同Component中不會出現不同的單例對象了

Hensen:老闆我要辭職了,天天加班,工資給得又少,工作量又那麼多,而且這個Dagger2太煩了,搞得我頭皮發麻
Jenny:老闆,我不會Dagger2,我也要辭職

1、源碼下載

2、結語

學習完Dagger2真的是一臉懵逼,如果沒有一定的思維能力還是挺難的,雅思最後員工都忍受不了Dagger2這麼複雜的東西,直接辭職了,哈哈哈哈,所以說選擇架構很重要,如果各位沒有心思研究新技術,還是先放著Dagger2讓它自由去吧,缺一個也不缺,還是去學習性價比比較高架構吧

回顧本節課內容:

    1. @Module、@Component、@Inject基本使用(Everyone)
    2. @Named建立不同的參數的執行個體(Hensen)
    3. @Singleton完成單個Component的執行個體(Jenny)
    4. @Singleton和@Scope在不同Component中保持同一個執行個體(Boss) 

Android實戰——Dagger2一場老闆與員工的故事會

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.