Dagger2在MVP中的应用
转载请说明出处:http://blog.youkuaiyun.com/a15286856575/article/details/53405630
需要基础
建议把基础学会再看下面文章好理解点。
为什么MVP中要用Dagger2?
我们首先看一下传统的mvp有什么缺点?
presenter在Activity的耦合
我们知道在传统的MVP中Preseter是在Activity中初始化的,也就是显式的new了一个对象,那么这里面在这个Activity中就有了耦合在里面。为什么会有耦合呢?
- 场景1: 假如你的项目中多次用到了这个Presetner,现在有这么个需求,这个Presenter依赖某个对象,需要在构造方法中传入这个对象,我们是不是要找到所有找到所有初始化这个Presenter的对象,然后去修改它,小项目还可以如果是大项目,我们是不是要找到所有的去修改。这就产生了耦合。怎么解决?Daggger2是个依赖注入框架,当前的Activity不用关心Presenter,是怎么创建的,具体的创建交给module.我们只需要修改module. .
- 场景2:假如Presenter需要对象A,对象A需要对象B,对象B需要对象C,我们是不是先C c= new B(),B b = new B(c),A a = new A(B) 然后在初始化Presenter。像这种情况,我们是不是每次都需要这样写,在Activity中还要关系他们的创建顺序。很繁琐,用Dagger2就可以解决这个问题。我们通过依赖注入,注入我们需要的对象,就大功告成了。
model在Presenter中的耦合
传统的的mvp中的model是在Presenter中进行初始化的,这里面也是显示的new了一个对象。同样也会有一个耦合在里面。
- 场景1:多个Presenter用了同一个model类,有同样的需求,model需要传入一个对象,我们是不是要找到用了这个model的所有Presenter,一个一个修改。里面是不是有耦合。同样我们可以通过dagger2注入model,在dagger2的module修改这个model就行了。
- 场景2:初始化一个Model,需要对象A,对象A需要对象B,对象B需要对象C,我们是不是先C c= new B(),B b = new B(c),A a = new A(B),然后初始化Model。我们在对model进行重用的时候,每次都要这样做很繁琐,通过dagger2中提供的创建的Module,我们可以注入这个model,是不是很省事。
注意module是Dagger2中的,model是mvp中的
当然Dagger2不仅仅局限于MVP,在有耦合的地方都可以用。
Dagger2在MVP中的具体实现
架构思路:对于上面两种情况。他们可以有同一个Module提供,那我们就可以有一套依赖体系实现,例如登录,我们LoginModule提供Presenter和Model,LoginComponent负责注入,就行了。但是我们还需要一个全局的AppModule,提供OkHttpClient ,Sevivce,Retofit。然后让LoginComponent依赖他就行了。那么我们在LoginComponent,就能够拿到所有的Module.如图:
我们需要两个Component:
AppComponent
AppCompponet是在Applcation中初始化的所有是个全局的Component代码如下
@Singleton
@Component(modules = {AppModule.class, ClientModule.class, ServiceModule.class})
public interface AppComponent {
Application Application();
ApiService apiService();
}
这个组件相当于工厂管理员,他管理着AppModule,ClentModule,ServiceModule
通过他我们能找到这些Module所提供的实例。如果在其他Component依赖此Component,我们有需要那些module所提供的实例,那么我们就需要在AppComponent暴露这些对象,在这里我们暴露了Application ApiService;
- AppModule 主要提供Application对象。
@Module
public class AppModule {
private Application mApplication;
public AppModule(Application application) {
this.mApplication = application;
}
@Singleton
@Provides
public Application provideApplication() {
return mApplication;
}
@Singleton
@Provides
public Gson provideGson(){
return new Gson();}
}
- ClientModule
主要提供Retofit对象.其中包括了配置我们需要的Retofit
/**
* @author V.Wenju.Tian
* 使用构建者模式,模块化组件
*/
@Module
public class ClientModule {
private static final int TOME_OUT = 10;
public static final int HTTP_RESPONSE_DISK_CACHE_MAX_SIZE = 10 * 1024 * 1024;//缓存文件最大值为10Mb
private HttpUrl mApiUrl;
private GlobeHttpHandler mHandler;
private Interceptor[] mInterceptors;
/**
* @author: jess
* @date 8/5/16 11:03 AM
* @description: 设置baseurl
*/
private ClientModule(Buidler buidler) {
this.mApiUrl = buidler.apiUrl;
this.mHandler = buidler.handler;
this.mInterceptors = buidler.interceptors;
}
public static Buidler buidler() {
return new Buidler();
}
/**
* @param cache 缓存
* @param intercept 拦截器
* @return
* @author: jess
* @date 8/30/16 1:12 PM
* @description:提供OkhttpClient
*/
@Singleton
@Provides
OkHttpClient provideClient(Cache cache, Interceptor intercept) {
final OkHttpClient.Builder okHttpClient =