上一篇主要講解了一下MVP框架的搭建和組成,這篇主要來(lái)講在MVP上添加Dagger2依賴(lài)注入。
在之前的MVP中,我們都是在V中直接new一個(gè)P的,現(xiàn)在我們需要將new的操作放在Dagger2中,讓它幫我們完成。
提到Dagger2的注入,我們就知道我們至少需要兩個(gè)類(lèi)Component和Module(可以不使用Module,但為了通用性和易懂性,建議使用Module),所以需要新建這兩個(gè)類(lèi)。Dagger2的注入,是一個(gè)類(lèi)一個(gè)注入器,這樣我們就可以根據(jù)模塊的不同來(lái)新建不同模塊下的注入器了。
首先在oneActivity中新建一個(gè)包名叫daggerComponent,然后在該包下新建Module和Component。這里要解釋一下為什么我會(huì)將這兩個(gè)類(lèi)放在一個(gè)包中,官方的做法是這兩個(gè)類(lèi)是和MVP類(lèi)同級(jí)的,也就是說(shuō)并沒(méi)有daggerComponent這個(gè)包,而我增加這個(gè)包,主要是為了防止這個(gè)模塊里面需要多個(gè)注入器,也是為了方便和簡(jiǎn)潔美觀。
在Module中我們主要提供P的實(shí)例化構(gòu)成,如下:
@Modulepublic class MainModule { PRivate final IMainConstane.IMainView mView; public MainModule(IMainConstane.IMainView mView) { this.mView = mView; } @Provides IMainConstane.IMainView providesMainView() { return mView; } @Provides IMainConstane.IMainPresenter providesMainPresenter(IMainConstane.IMainView view, IUserModel usermodel) { return new MainPresenter(view, usermodel); }} 注意這里的變量類(lèi)型都是接口,要習(xí)慣接口化編程。然后看一下Component的代碼:
@SingleUserModel@Component(dependencies = UserModelComponent.class, modules = MainModule.class)public interface MainComponent { void inject(MainActivity activity);}@SingleUserModel標(biāo)簽是我自定義的,主要是因?yàn)槲业腢serModelComponent中使用了@Singleton標(biāo)簽,而dagger2中不允許兩個(gè)依賴(lài)的Component有一樣的@Scop。然后是dependencies依賴(lài),我們?cè)跇?gòu)建P的時(shí)候,是需要數(shù)據(jù)模塊對(duì)象的,所以這里依賴(lài)UserModelComponent讓它提供數(shù)據(jù)模塊對(duì)象。MainModule類(lèi)我們剛看了,沒(méi)有什么,只是一個(gè)很普通的Module,然后我們來(lái)看一下UserModel的注入器UserModelComponent,可以看到里面就一句話(huà):
@Singleton@Component(modules = {UserModule.class, applicationModule.class})public interface UserModelComponent { IUserModel getUserModel();} 這個(gè)接口是給依賴(lài)它的類(lèi)提供數(shù)據(jù)對(duì)象的,比如上面的MainComponent依賴(lài)這個(gè)UserModelComponent,那么這個(gè)接口就是當(dāng)作一個(gè)參數(shù)傳遞給MainComponent。
一個(gè)Component通常是承載一個(gè)Module,我們看一下UserModeul:
@Modulepublic class UserModule { @Provides @Singleton public IUserModel providesUserModule(Context context) { return new UserModelImpl(context); }} 看到這個(gè)providesUserModule方法是被打上@Singleton單例標(biāo)簽的,但它真的可以實(shí)現(xiàn)單例嗎?后面再說(shuō)!該方法還需要一個(gè)Context參數(shù)(這個(gè)參數(shù)其實(shí)在數(shù)據(jù)模塊中沒(méi)被用到,只不過(guò)是我加上的,這樣容易理解后面的內(nèi)容),它從哪里來(lái)?我們回到UserModelComponent中,看到它還承載了一個(gè)Module類(lèi),那就是ApplicatinModule,看這個(gè)類(lèi):
@Modulepublic final class ApplicationModule { private final Context mContext; ApplicationModule(Context context) { mContext = context; } @Provides Context provideContext() { return mContext; }} 注意這個(gè)類(lèi)在項(xiàng)目中的位置,它是和MyApplication同級(jí)的,也就是說(shuō)它提供全局的實(shí)例,比如全局上下文,比如全局的環(huán)境實(shí)例。
最后MainComponent通過(guò)編譯之后生成DaggerMainComponent,執(zhí)行inject方法進(jìn)行依賴(lài)注入,最后在MainActivity中實(shí)例化了mMainPresenter變量,我們也就可以使用它了。
源碼下載
詳細(xì)的Dagger2+MVP融合,一行一行分析,一點(diǎn)一點(diǎn)進(jìn)步,之一
詳細(xì)的Dagger2+MVP融合,一行一行分析,一點(diǎn)一點(diǎn)進(jìn)步,之二
詳細(xì)的Dagger2+MVP融合,一行一行分析,一點(diǎn)一點(diǎn)進(jìn)步,之四
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注