google四件套之Dagger2。從入門到愛不釋手,之:Dagger2進階知識及在Android中使用

前言

網上都說Dagger2是比較難上手的,我在看了大量資料和使用時也遇到了不少不懂或者模糊的知識點,並且大部分博客資料都比較古老。忽然有那麼一瞬間,忽然明白了因此然,故總結了4篇文章。話說在java中使用仍是很繁瑣的,不要怕帶你真正上手,並運用到咱們的Android項目中去。java

本次Dagger2講解總共分4篇:
一、Dagger2基礎知識及在Java中使用(1)
二、Dagger2基礎知識及在Java中使用(2)
三、Dagger2進階知識及在Android中使用
四、Dagger2華麗使用在MVP框架中android

經過前2篇文章的學習,已經熟悉Dagger2在Java中的使用了。可是你會發現,每次須要注入都要寫對應的Component後,Inject到相關也面。並且在每一個頁面都要DaggerComponent.builder().build.inject(activity)。這樣是太繁瑣,還沒開始,就以爲繁瑣了。因此強大google推出了擴展包dagger.android。git

仍是老樣子,博客貼的代碼,有部分省略,只爲便於理解。
github

Dagger2在Android中的使用

本篇就一節。只要配置好相關信息後,全局Component只有一個。Module你能夠寫多個,其實也能夠只寫2個,爲何呢,看下面。
首先是添加依賴,以前Java的依賴跟這裏不相關哦app

implementation 'com.google.dagger:dagger-android:2.24'
    // if you use the support libraries(就是你須要v4.Fragment就須要加上support包)
    implementation 'com.google.dagger:dagger-android-support:2.24'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'
複製代碼


這裏舉2個例子把,一個帶Module和一個不帶Module的在Android中的使用,不帶Module的小孩類Children以下,在其構造方法加上@Inject標註:框架

public class Children {
    @Inject
    public Children() {

    }
}
複製代碼


而後是帶Module的超人類SurperMan,假設是一個第三方類庫,不能帶@Inject標註。ide

public class SurperMan {
}
複製代碼


咱們此時的Modulepost

@Module
public class SurperManModule {
    @Provides
    SurperMan surperManProvides(){
        return new SurperMan();
    }
}
複製代碼


這個時候dagger.android包提供了一個@ContributesAndroidInjector標註是爲了省去咱們每次去Activity裏初始化Component,以下學習

@Module
//抽象類,名字自定義,
public abstract class NeedInjectModules {
    //這個方法的意思標識要注入到ForAndroidActivity頁面。若是須要在MainActivity頁面的話。繼續加這個方法,返回值爲
    //MainActivity便可
    @ContributesAndroidInjector
    abstract ForAndroidActivity inject();
}
複製代碼


以前就提過,在dagger.android包裏。大概思路是在Application初始化ApplicationComponent,而後咱們經過@ContributesAndroidInjector標註,他內部幫我實現了Component依賴Component。那麼咱們的惟一個Component長這樣ui

//這裏AndroidSupportInjectionModule是系統的,必須加上
//NeedInjectModules是咱們要註冊到Activity的
//SurperManModule,surperMan的
@Component(modules = {
        AndroidSupportInjectionModule.class,
        NeedInjectModules.class,
        SurperManModule
})

//繼承AndroidInjector<T>,泛型就是咱們的application
public interface AppComponent extends AndroidInjector<MyApplication> {
    
    //還記得@Component.Builder的用法嗎,能夠看以前的。
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }

}
複製代碼


這些準備工做都作完了後,記得Make Project,接下來是重點了,咱們的Application繼承DaggerApplication,這裏會實現一個方法,是將咱們的AppComponent.Builder返回出去,以下

public class MyApplication extends DaggerApplication {
   
    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().application(MyApplication.this).build();
    }

}
複製代碼


這裏也是關鍵點,在Activity裏使用或者在Fragment裏使用,只需繼承咱們的DaggerActivity&DaggerFragment。直接看咱們的Activity

public class ForAndroidActivity extends DaggerAppCompatActivity {
    @Inject
    Children children;
    @Inject
    SurperMan surperMan;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_astudy);
        LogUtils.i("已經生成實例",children.hashCode()+"");
        LogUtils.i("已經生成實例",surperMan.hashCode()+"");
    }
}
複製代碼


至此,在Android中的簡單使用,已經所有介紹完,是否是代碼比較簡潔。是否是已經愛不釋手了!

本文github Demo地址

花了老大勁,別誤會,不是要錢。能不能留下個足跡star啊

相關文章
相關標籤/搜索