Android MVP入門到進(jìn)階之-結(jié)合Dagger2

前言

本系列共三篇:
Android MVP入門到進(jìn)階之-簡單入門
Android MVP入門到進(jìn)階之-結(jié)合Dagger2
Android MVP入門到進(jìn)階之- 系統(tǒng)框架集成(完結(jié))

昨天候衍,寫了一篇mvp入門框架搭建文章
Android MVP入門到進(jìn)階之-簡單入門
通過一個(gè)簡單的例子澄成,介紹mvp的簡單使用,今天我們依然從demo入手介紹mvp模式結(jié)合注解框架Dagger2的使用倚喂,注意本文不介紹dagger2的用法斋泄,只簡單介紹dagger2結(jié)合mvp框架如何進(jìn)一步解耦杯瞻。如果不了解dagger2的用法,請查閱官方文檔Dagger2炫掐,或者閱讀以下文章:
Dagger2 入門,以初學(xué)者角度
dagger 2 詳解
在此我們感謝以上文章的作者魁莉,給我提供好的學(xué)習(xí)指南。

使用Dagger2有什么好處?

1.增加開發(fā)效率旗唁、省去重復(fù)的簡單體力勞動(dòng)
2.更好的管理類實(shí)例
3.解耦合

話不多少畦浓,開始寫demo吧

添加依賴

在module的build.gradle中添加Dagger2 的依賴

    implementation 'com.google.dagger:dagger:2.16'
    implementation 'com.google.dagger:dagger-android:2.16'
    implementation 'com.google.dagger:dagger-android-support:2.16'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.16'

書寫AppModule類,用于提供應(yīng)用Appliction 的實(shí)例

/**
 * @desc AppModule
 * @author Marlon
 * @date 2018/10/9
 */
@Module
public class AppModule {
    private final App application;

    public AppModule(App application) {
        this.application = application;
    }

    @Provides
    @Singleton
    App provideApplicationContext() {
        return application;
    }
}

書寫AppComponent接口 用于管理AppModule

/**
 * @desc AppComponent 用于提供Application 
 * @author Marlon
 * @date 2018/10/9
 */
@Singleton
@Component(modules = {AppModule.class/*, HttpModule.class*/})
public interface AppComponent {

    App getContext();  // 提供App的Context

//    BaseApiService retrofitHelper();  //提供http請求的幫助類這里暫時(shí)不管检疫,后續(xù)講
}

書寫ActivityModule接口 用于提供Activity實(shí)例

/**
 * @desc ActivityModule
 * @author Marlon
 * @date 2018/10/9
 */

@Module
public class ActivityModule {
    private Activity mActivity;

    public ActivityModule(Activity activity) {
        this.mActivity = activity;
    }

    @Provides
    @ActivityScope
    public Activity provideActivity() {
        return mActivity;
    }
}

書寫ActivityComponent接口 注冊要用于依賴注入的Activity

/**
 * @desc ActivityComponent 用于管理需要進(jìn)行依賴注入的Activity
 * @author Marlon
 * @date 2018/10/9
 */
@ActivityScope
@Component(dependencies = AppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {

    Activity getActivity();

    void inject(MainActivity mainActivity);//用于注入MainActivity
    void inject(LoginActivity loginActivity);//用于注入LoginActivity
    //TODO 后續(xù)需要注入的Activity類都可以在這里添加 中像上面一樣寫就好了
}

書寫App類

/**
 * @desc App
 * @author Marlon
 * @date 2018/10/9
 */
public class App extends Application {
    private static App instance;
    public static AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static synchronized App getInstance() {
        return instance;
    }

    public static AppComponent getAppComponent() {
        if (appComponent == null) {
            appComponent = DaggerAppComponent.builder()
                    .appModule(new AppModule(instance))
//                    .httpModule(new HttpModule())  創(chuàng)建網(wǎng)絡(luò)請求的module這里暫時(shí)不管讶请,
                    .build();
        }
        return appComponent;
    }

}

在LoginActivity中 去掉了 new LoginPresenter 在 LoginPresenter 上添加了注解@Inject

/**
 * @desc LoginActivity
 * @author Marlon
 * @date 2018/10/9
 */
public class LoginActivity extends AppCompatActivity implements LoginContract.View {
    @Inject
    LoginPresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        DaggerActivityComponent.builder().appComponent(App.getAppComponent()).activityModule(new ActivityModule(this)).build().inject(this);
        mPresenter.attachView(this);
    }

    @Override
    public void gotoMain() {
        startActivity(new Intent(this,MainActivity.class));
    }

    @Override
    public void showToast(String msg) {
        Toast.makeText(this.getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
    }

    public void onClickLogin(View view) {
        mPresenter.login();
    }
}

再看一下修改后的LoginPresenter

/**
 * @author Marlon
 * @desc
 * @date 2018/10/8
 */

public class LoginPresenter implements LoginContract.Presenter {

    LoginActivity view;
    @Inject
    public LoginPresenter() {

    }

    @Override
    public void login() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    view.showToast("登錄成功");
                    view.gotoMain();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


    @Override
    public void attachView(LoginContract.View view) {
        this.view = (LoginActivity) view;
    }

    @Override
    public void detachView() {
        this.view = null;
    }
}

到這里我們的demo大致內(nèi)容就已經(jīng)結(jié)束了,是不是很簡單屎媳,就是幾個(gè)簡單的注解秽梅,我們就實(shí)現(xiàn)了Presenter和View的完全解耦,沒有看到 new 關(guān)鍵字剿牺,也沒有看到構(gòu)造方法中的參數(shù)企垦,有沒有很美好?
這個(gè)項(xiàng)目demo在這里晒来,里面有更多的細(xì)節(jié)知識(shí)钞诡,有需要的你可以查閱一下,如果覺得對你有幫助湃崩,請給個(gè)小心心哈荧降,如果遇到什么問題,也可以給我反饋一下攒读,大家共同學(xué)習(xí)嘛朵诫,
本項(xiàng)目demo依然是基于官方# googlesamples/android-architecture的todo?mvp?dagger分支簡化而來,去除大部分我們平時(shí)開發(fā)很少用到的注解薄扁,如果你有足夠好的Dagger2基礎(chǔ)剪返,你可以查閱官方demo,有更多的知識(shí)等著你喲邓梅。

總結(jié)

通過這兩天的總結(jié)脱盲,我們隊(duì)mvp及配合dagger有了一定的理解,想想原來mvp+dagger的架構(gòu)搭建原來如此的簡單日缨,是的钱反,對于我們出學(xué)者而言,確實(shí)是有一定的收獲了匣距,但是我們項(xiàng)目還是很簡單面哥,還沒有涉及到網(wǎng)絡(luò)請求呢,我們在公司做項(xiàng)目怎么能缺少網(wǎng)絡(luò)請求呢毅待,這個(gè)是必不可少的尚卫。所以我們將在下一篇總結(jié)一下
Android MVP入門到進(jìn)階之- 系統(tǒng)框架集成(完結(jié))

本文章為原創(chuàng)博客,轉(zhuǎn)載請注明出處恩静!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焕毫,一起剝皮案震驚了整個(gè)濱河市蹲坷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邑飒,老刑警劉巖循签,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疙咸,居然都是意外死亡县匠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門撒轮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乞旦,“玉大人,你說我怎么就攤上這事题山±挤郏” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵顶瞳,是天一觀的道長玖姑。 經(jīng)常有香客問我,道長慨菱,這世上最難降的妖魔是什么焰络? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮符喝,結(jié)果婚禮上闪彼,老公的妹妹穿的比我還像新娘。我一直安慰自己协饲,他們只是感情好畏腕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著囱稽,像睡著了一般郊尝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上战惊,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音扎即,去河邊找鬼吞获。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谚鄙,可吹牛的內(nèi)容都是我干的各拷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闷营,長吁一口氣:“原來是場噩夢啊……” “哼烤黍!你這毒婦竟也來了知市?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤速蕊,失蹤者是張志新(化名)和其女友劉穎嫂丙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规哲,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跟啤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唉锌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隅肥。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖袄简,靈堂內(nèi)的尸體忽然破棺而出腥放,到底是詐尸還是另有隱情,我是刑警寧澤绿语,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布秃症,位于F島的核電站,受9級(jí)特大地震影響汞舱,放射性物質(zhì)發(fā)生泄漏伍纫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一昂芜、第九天 我趴在偏房一處隱蔽的房頂上張望莹规。 院中可真熱鬧,春花似錦泌神、人聲如沸良漱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽母市。三九已至,卻和暖如春损趋,著一層夾襖步出監(jiān)牢的瞬間患久,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工浑槽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒋失,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓桐玻,卻偏偏與公主長得像篙挽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子镊靴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容