Dagger2在MVP中的应用(Dagger2+Retorfit+MVP)

本文介绍了Dagger2如何在MVP架构中解决耦合问题,包括Presenter与Activity、Model的耦合。通过Dagger2的依赖注入,简化了对象创建和管理,降低了代码复杂性。文中详细阐述了AppComponent和LoginComponent的实现,以及具体注入流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.如图:
image
我们需要两个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 = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值