使用Dagger 2進(jìn)行依賴注入 - Producers
原文:http://frogermcs.github.io/dependency-injection-with-dagger-2-producers/
本文是在Android中使用Dagger 2框架進(jìn)行依賴注入的系列文章中的一部分。今天我們將探索下Dagger Producers - 使用Java實(shí)現(xiàn)異步依賴注入的Dagger2的一個(gè)擴(kuò)展。
初始化性能問題
我們都知道Dagger 2是一個(gè)優(yōu)化得很好的依賴注入框架。但是即使有這些全部的微優(yōu)化,仍然在依賴注入的時(shí)候存在可能的性能問題 - “笨重”的第三方庫(kù)和/或我們那些主線程阻塞的代碼。
依賴注入是在盡可能短的時(shí)間內(nèi)在正確的地方傳遞所請(qǐng)求的依賴的過程 - 這些都是Dagger 2做得很好的。但是DI也會(huì)去創(chuàng)建各種依賴。如果我們需要花費(fèi)幾百毫秒創(chuàng)建它們,那么以納秒級(jí)的時(shí)間去提供依賴還有什么意義呢?
當(dāng)我們的app創(chuàng)建了一系列繁重的單例并立即由Dagger2提供服務(wù)之后也許可能沒有這么重要。但是在我們創(chuàng)建它們的時(shí)候仍然需要一個(gè)時(shí)間成本 - 大多數(shù)情況下決定了app啟動(dòng)的時(shí)間。
這問題(已經(jīng)給了提示怎么去調(diào)適它)已經(jīng)在我之前的一篇博客中描述地很詳細(xì)了:Dagger 2 - graph creation performance。
在很短的時(shí)間內(nèi),讓我們想象這么一個(gè)場(chǎng)景 - 你的app有一個(gè)初始化的界面(SplashScreen),需要在app啟動(dòng)后立即做一些需要的事情:
初始化所有tracking libs(Goole Analytics, Crashlytics)然后發(fā)送第一份數(shù)據(jù)給它們。
創(chuàng)建用于API和/或數(shù)據(jù)庫(kù)通信的整個(gè)棧。
我們?cè)噲D的交互邏輯(MVP中的Presenters,MVVM中的ViewModels等等)。
即使我們的代碼是優(yōu)化地非常好的,但是仍然有可能有些額外的庫(kù)需要幾十或者幾百毫秒的時(shí)間來初始化。在我們啟動(dòng)界面之前將展示必須初始化和交付的所有請(qǐng)求的依賴(和它們的依賴)。這意味著啟動(dòng)時(shí)間將會(huì)是它們每一個(gè)初始化時(shí)間的總和。
由 AndroidDevMetrics 測(cè)量的示例堆??赡苋缦滤荆?/p>