前言
本系列共三篇:
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)載請注明出處恩静!