Dagger2学习笔记

2017-09-27  本文已影响0人  Beck766

引入Dagger2

//添加如下代码,应用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。

上一篇下一篇

猜你喜欢

热点阅读