美文网首页
Dagger2学习笔记

Dagger2学习笔记

作者: Beck766 | 来源:发表于2017-09-27 15:45 被阅读0次

    引入Dagger2

    • 配置apt插件(在build.gradle(Project:xxx)中添加如下代码)
      classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    • 添加依赖(在build.gradle(Module:app)中添加如下代码)
    //添加如下代码,应用apt插件 
    apply plugin: 'com.neenbedankt.android-apt' 
    ... 
    dependencies { 
    ... 
    compile 'com.google.dagger:dagger:2.4' 
    apt 'com.google.dagger:dagger-compiler:2.4' 
    //java注解 
    compile 'org.glassfish:javax.annotation:10.0-b28'
     ... 
    }
    

    使用Dagger2

    在mvp中,最常见的一种依赖关系,就是Activity持有presenter的引用,并在Activity中实例化这个presenter,即Activity依赖presenter,presenter又需要依赖View接口,从而更新UI。
    用依赖注入的方式写,代码如下:

        public class MainActivity extends AppCompatActivity implements MainContract.View {
            @Inject
            MainPresenter mainPresenter; 
            ...
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                DaggerMainComponent.builder()
              .mainModule(new MainModule(this))
              .build()
              .inject(this); //调用Presenter方法加载数据          
    
              mainPresenter.loadData(); 
              ... 
            } 
        }
             public class MainPresenter {
            //MainContract是个接口,View是他的内部接口,这里看做View接口即可
            private MainContract.View mView;
    
            @Inject
            MainPresenter(MainContract.View view) {
                mView = view;
            }
    
            public void loadData() {
                //调用model层方法,加载数据 
                //... 
                // 回调方法成功时
                mView.updateUI();
            }
    
            @Module
            public class MainModule {
                private final MainContract.View mView;
    
                public MainModule(MainContract.View view) {
                    mView = view;
                }
    
                @Provides
                MainView provideMainView() {
                    return mView;
                }
            }
    
            @Component(modules = MainModule.class)
            public interface MainComponent {
                void inject(MainActivity activity);
            }
    
    

    我们先看MainActivity里的代码,之前是直接声明MainPresenter,现在在声明的基础上加了一个注解@Inject,表明MainPresenter是需要注入到MainActivity中,即MainActivity依赖于MainPresenter,这里要注意的是,使用@Inject时,不能用private修饰符修饰类的成员属性。

    然后我们在MainPresenter的构造函数上同样加了@Inject注解。这样MainActivity里的mainPresenter与他的构造函数建立了某种联系。这种联系我们可以这样理解,当看到某个类被@Inject标记时,就会到他的构造方法中,如果这个构造方法也被@Inject标记的话,就会自动初始化这个类,从而完成依赖注入。

    然后,他们之间并不会凭空建立起联系,因此我们想到,肯定需要一个桥梁,将他们连接起来,也就是下面要介绍的Component。

    相关文章

      网友评论

          本文标题:Dagger2学习笔记

          本文链接:https://www.haomeiwen.com/subject/miqalxtx.html