天天看點

Dagger2使用

Dagger2的引入(與retrofit和rxjava一起使用):

在app的build.gradle中加入

//network
    compile "com.squareup.retrofit2:retrofit:$rootProject.ext.retrofitVersion"
    compile "com.squareup.retrofit2:converter-gson:$rootProject.ext.retrofitVersion"
    compile "com.squareup.retrofit2:adapter-rxjava2:$rootProject.ext.retrofitVersion"
    compile "com.squareup.okhttp3:logging-interceptor:$rootProject.ext.okhttpVersion"
    compile "io.reactivex.rxjava2:rxjava:$rootProject.ext.rxjavaVersion"
    compile "io.reactivex.rxjava2:rxandroid:$rootProject.ext.rxandroidVersion"

    //inject
    compile "com.google.dagger:dagger:$rootProject.ext.daggerVersion"
    annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.ext.daggerVersion"
           

在整個項目的build.gradle中加入(有些不是相關的,請自行忽略):

ext{
    loggerVersion = "1.15"
    stethoVersion = "1.4.2"
    leakcanaryVersion = "1.5"
    blockcanaryVersion = "1.5.0"
    rxjavaVersion = "2.0.7"
    rxandroidVersion = "2.0.1"
    okhttpVersion = "3.6.0"
    retrofitVersion = "2.2.0"
    daggerVersion = "2.10-rc4"
}
           

Dagger2的核心是module提供執行個體,component提供注入。下面直接來看它的使用

首先建立一個類叫做AppModule,它的作用是對外提供全局的執行個體,

例如context,

private Context mContext;

    public AppModule(Context mContext) {
        this.mContext = mContext;
    }

    @Singleton
    @Provides
    Context provideContext(){
        return mContext;
    }
           

retrofit對象,

@Singleton
    @Provides
    Retrofit provideRetrofit(@Named("base_url") String baseUrl, OkHttpClient client)      {
        return new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }
           

Gson對象,

@Singleton
    @Provides
    Gson provideGson() {
        return new Gson();
    }
           

以及Httpclient對象

@Provides
    OkHttpClient provideOkHttpClient(HttpLoggingInterceptor loggingInterceptor, Cache cache, @Named("cache_interceptor") Interceptor cacheInterceptor, @Named("parameter_interceptor") Interceptor parameterInterceptor) {
        return new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)
                .cache(cache)
                .addInterceptor(cacheInterceptor)
                .addInterceptor(parameterInterceptor)
                .addNetworkInterceptor(cacheInterceptor)
                .addNetworkInterceptor(new StethoInterceptor())
                .build();
    }
           

等等需要放在全局的執行個體,都放在這裡。。。。

接着需要寫的是AppComponent: component的作用就是注入

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    /**
     * 擷取上下文對象
     *
     * @return context
     */
    Context getContext();

    /**
     * 擷取Gson對象
     *
     * @return Gson執行個體
     */
    Gson getGson();

    /**
     * 擷取Retrofit對象
     *
     * @return Retrofit執行個體
     */
    Retrofit getRetrofit();

    /**
     * 擷取HttpHelper
     *
     * @return HttpHelper的執行個體
     */
    HttpManager getHttpHelper();
}
           

下面舉個具體的例子來看:

在特定的activity中,一般來說是一個頁面一個component

@PerActivity
@Component(modules = ExamplePresenterModule.class, dependencies = AppComponent.class)
interface ExampleComponent {

    void inject(ExampleActivity exampleActivity);

}
           
@Component(modules = ExamplePresenterModule.class,
           

是固定寫法,modules = 這個頁面需要的module

void inject(ExampleActivity exampleActivity);
           

這就是目标activity

接下來看看ExamplePresenterModule

@Module
class ExamplePresenterModule {
    private ExampleContract.View mView;

    public ExamplePresenterModule(ExampleContract.View mView) {
        this.mView = mView;
    }

    @PerActivity
    @Provides
    ExamplePresenter provideExamplePresenter(RetrofitService retrofitService, HttpManager httpManager){
        return new ExamplePresenter(mView,retrofitService,httpManager);
    }

 @Provides
    RetrofitService provideRetrofitService(Retrofit retrofit){
        return retrofit.create(RetrofitService.class);
    }
}
           

它在這裡的作用主要就是提供一個ExamplePresenter執行個體,用于網絡請求資料,它的參數中的RetrofitService也是一個對象,也是需要建立的,是以才會有下面的代碼

@Provides
    RetrofitService provideRetrofitService(Retrofit retrofit){
        return retrofit.create(RetrofitService.class);
    }
           

而另一個參數

HttpManager httpManager

已經在全局的module中建立過了,是以不需要再建立了

接着在ExampleActivity中注入(onCreate中):

@Override
    protected void setUpInject() {
        DaggerExampleComponent.builder()
                .appComponent(getAppComponent())
                .examplePresenterModule(new ExamplePresenterModule(mFragment))
                .build()
                .inject(this);
    }
           

要想使用presenter,需要在類中注入它,注入之後在activity的範圍内就可以盡情的使用它了

@Inject
    ExamplePresenter mPresenter;
           

我是在activity下面的fragment中使用的

在需要發起請求的地方:

這個項目整體用的是MVP+Retrofit+RxJava+Dagger2

項目位址:https://github.com/ckwcc/MVP-Retrofit-RxJava-Dagger2