国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

詳細(xì)的Dagger2+MVP融合,一行一行分析,一點(diǎn)一點(diǎn)進(jìn)步,之三

2019-11-07 23:30:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

    上一篇主要講解了一下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)步,之四


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 涞源县| 龙泉市| 台州市| 嘉黎县| 新化县| 济南市| 武城县| 武安市| 河曲县| 长葛市| 甘德县| 江华| 防城港市| 桦川县| 阿尔山市| 当阳市| 贵溪市| 南陵县| 通州市| 蛟河市| 定日县| 襄樊市| 甘泉县| 随州市| 泊头市| 囊谦县| 岐山县| 垣曲县| 正定县| 司法| 奉化市| 柘荣县| 武城县| 衡阳县| 旌德县| 元江| 内黄县| 满城县| 高淳县| 福安市| 博罗县|