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