Android項(xiàng)目基本架構(gòu)(二) Dagger2

image.png

說明


  • Dagger2 是谷歌推出的一個(gè)依賴注入框架,現(xiàn)在網(wǎng)絡(luò)上有很多關(guān)于Dagger2 的使用說明,但是,我發(fā)現(xiàn),其實(shí)他們大多數(shù)都是按照J(rèn)ava中的使用方式在Android開發(fā)中使用,這樣使用是很不方便的,因?yàn)槟銦o法將Dagger2 的初始化放到BaseActivity中,每個(gè)你需要使用依賴注入的Activity或者Fragment中,你都要手動(dòng)調(diào)用來進(jìn)行依賴注入,很有可能在你需要使用依賴注入的時(shí)候卻忘記了調(diào)用,這樣的開發(fā)效率無疑是很低的。那么,接下來,我就會(huì)告訴大家,如何在Android開發(fā)中使用Dagger2。

添加依賴


  • 首先,使用一個(gè)第三方第一件事必然是添加依賴,Dagger2 官方Github上給的是這樣的:

      dependencies {
        compile 'com.google.dagger:dagger:2.x' // Dagger2
        annotationProcessor 'com.google.dagger:dagger-compiler:2.x' // 注解處理器
      }
    
  • 但是,這個(gè)依賴實(shí)際上實(shí)在Java開發(fā)中使用的,如果在Android開發(fā)中使用,應(yīng)該是這樣:

    dependencies {
      compile 'com.google.dagger:dagger-android:2.10-rc4' // Dagger2 Android包
      // 如果使用支持包, 上面的Android包可以省略,支持包里面已經(jīng)包含了
      compile 'com.google.dagger:dagger-android-support:2.10-rc4' // Dagger2 Android 支持包,用于支持v4、v7下的控件
      annotationProcessor 'com.google.dagger:dagger-compiler:2.10-rc4' // 注解處理器
    }
    
  • <b>注意:在使用最新正式版2.10時(shí),需要在android節(jié)點(diǎn)下配置</b>

      android{
          ... ...
          configurations.all {
              resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
          }
      }
    

Dagger2 使用


  • 依賴添加完了,那么接下來就是使用了,在使用的過程中,筆者踩過很多坑,但最終都得到了解決。

  • 首先,在BaseActivity的onCreate(@Nullable Bundle savedInstanceState) 方法中, super.onCreate(savedInstanceState)前添加:AndroidInjection.inject(this)

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        // Dagger2 依賴注入,放在onCreate()前
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
    }
    
  • 雖然在Dagger2 的Android support 包中為我們提供了DaggerAppCompatActivity類,但是實(shí)際開發(fā)中我們并不能直接去繼承他使用,因?yàn)樵谒峁┑念愔校⑷肓藘蓚€(gè)Injector:

    @Inject DispatchingAndroidInjector<Fragment> supportFragmentInjector; // v4包下Fragment
    @Inject DispatchingAndroidInjector<android.app.Fragment> frameworkFragmentInjector; // app包下Fragment
    
  • 一個(gè)是v4包下的Fragment依賴注入,一個(gè)是app包下的Fragmnet依賴注入,所以,除非你的項(xiàng)目中,同時(shí)用到了這兩種Fragment,否則,不要繼承Dagger2提供的DaggerAppCompatActivity。

  • 接下來就是BaseFragment,這個(gè)可以繼承Dagger2提供的DaggerFragment,當(dāng)然啦,也要注意,v4包下的Fragment要繼承support包下的DaggerFragment, app包下的要繼承android包下的DaggerFragment。

  • 這個(gè)實(shí)際上也只是在onAttach(Context context)方法中,在super.onAttach(context)前添加了AndroidInjection.inject(this) 或者 AndroidSupportInjection.inject(this)

    @Override
    public void onAttach(Context context) {
      AndroidSupportInjection.inject(this); // v4 Fragment
      super.onAttach(context);
    }
    
    @Override
    public void onAttach(Context context) {
      AndroidInjection.inject(this); // Fragment
      super.onAttach(context);
    }
    
  • 接下來要做的就是編寫Activity、Fragment的組件、模塊了。新建

    MainActivitySub.java
    @Subcomponent // 每一個(gè)Activity都有與之對(duì)應(yīng)的Sub類
    public interface MainActivitySub extends AndroidInjector<MainActivity> {
        @Subcomponent.Builder
       abstract class Builder extends AndroidInjector.Builder<MainActivity> {
       }
    }
    
    ActivityModule.java
    @Module(subcomponents = {MainActivitySub.class, Main2AcitivitySub.class ...}) // 用于注入Activity,將每個(gè)Activity的Sub類添加到數(shù)組
    public abstract class ActivityModule {
    
        @Binds
        @IntoMap
        @ActivityKey(MainActivity.class) // 提供每一個(gè)Activity
        abstract AndroidInjector.Factory<? extends Activity>
        bindMainActivity(MainActivitySub.Builder builder);
    
        @Binds
        @IntoMap
        @ActivityKey(Main2Activity.class) // 提供每一個(gè)Activity
        abstract AndroidInjector.Factory<? extends Activity>
        bindMain2Activity(Main2ActivitySub.Builder builder);
    
        ... ...
    }
    
  • 同樣的,F(xiàn)ragment也是這樣:

    MainFragmentSub.java
    @Subcomponent // 每一個(gè)Fragment都有與之對(duì)應(yīng)的Sub類
    public interface MainFragmentSub extends AndroidInjector<MainFragment> {
        @Subcomponent.Builder
       abstract class Builder extends AndroidInjector.Builder<MainFragment> {
       }
    }
    
    FragmentModule.java
    @Module(subcomponents = {MainFragmentSub.class, Main2FragmentSub.class ...}) // 用于注入Fragment,將每個(gè)Fragment的Sub類添加到數(shù)組
    public abstract class FragmentModule {
    
        @Binds
        @IntoMap
        @FragmentKey(MainActivity.class) // 提供每一個(gè)Fragment,注意:這里的FragmentKey是根據(jù)Fragment選擇的,v4 下使用support包下的
        abstract AndroidInjector.Factory<? extends Fragment>
        bindMainFragment(MainFragmentSub.Builder builder);
    
        @Binds
        @IntoMap
        @FragmentKey(Main2Fragment.class) // 提供每一個(gè)Activity
        abstract AndroidInjector.Factory<? extends Fragment>
        bindMain2Fragment(Main2FragmentSub.Builder builder);
    
        ... ...
    }
    
  • 最后,新建

    ApplicationSub.java // 使用Component注解,將ActivityModule和FragmentModule添加到數(shù)組
    @Component(modules = {ActivityModule.class, FragmentModule.class})
    public interface ApplicationSub {
        void inject(MyApplication app); // 注入MyApplication
    }
    
  • 這樣,Dagger2的配置就基本完成了,現(xiàn)在只需要完成MyApplication的配置:

    public class MyApplication extends Application
                implements HasDispatchingActivityInjector,  // 實(shí)現(xiàn)Activity、Fragment注入接口
                      HasDispatchingSupportFragmentInjector {
    
       /** Dagger2 Activity Injector */
        @Inject
        DispatchingAndroidInjector<Activity> activityInjector;
        /** Dagger2 Fragment Injector*/
        @Inject
        DispatchingAndroidInjector<Fragment> fragmentInjector;
    
        @Override
        public void onCreate() {
            super.onCreate();
            // DaggerApplicationSub在編譯后生成
            DaggerApplicationSub.create().inject(this);
        }
    
        @Override
        public DispatchingAndroidInjector<Activity> activityInjector() {
            return activityInjector;
        }
    
        @Override
        public DispatchingAndroidInjector<Fragment> supportFragmentInjector() {
            return fragmentInjector;
        }
    }
    

最后


  • 好了,就這樣Dagger2的配置就完成了,你可以在你的項(xiàng)目里盡情的使用Dagger2依賴注入了,只需要讓你的Activity、Fragment繼承BaseActivity、BaseFragment,不必再重復(fù)的調(diào)用Daggerxxxxxx.create().inject(this)了。
  • Dagger2使用指南
  • 項(xiàng)目Github地址
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容