【发布时间】:2017-10-10 09:48:13
【问题描述】:
嘿,我正在使用 Dagger2、Retrofit 和 OkHttp,我正面临依赖周期问题。
提供OkHttp时:
@Provides
@ApplicationScope
OkHttpClient provideOkHttpClient(TokenAuthenticator auth,Dispatcher dispatcher){
return new OkHttpClient.Builder()
.connectTimeout(Constants.CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(Constants.READ_TIMEOUT,TimeUnit.SECONDS)
.writeTimeout(Constants.WRITE_TIMEOUT,TimeUnit.SECONDS)
.authenticator(auth)
.dispatcher(dispatcher)
.build();
}
提供Retrofit时:
@Provides
@ApplicationScope
Retrofit provideRetrofit(Resources resources,Gson gson, OkHttpClient okHttpClient){
return new Retrofit.Builder()
.baseUrl(resources.getString(R.string.base_api_url))
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
}
提供APIService时:
@Provides
@ApplicationScope
APIService provideAPI(Retrofit retrofit) {
return retrofit.create(APIService.class);
}
我的APIService界面:
public interface APIService {
@FormUrlEncoded
@POST("token")
Observable<Response<UserTokenResponse>> refreshUserToken();
--- other methods like login, register ---
}
我的TokenAuthenticator 班级:
@Inject
public TokenAuthenticator(APIService mApi,@NonNull ImmediateSchedulerProvider mSchedulerProvider) {
this.mApi= mApi;
this.mSchedulerProvider=mSchedulerProvider;
mDisposables=new CompositeDisposable();
}
@Override
public Request authenticate(Route route, Response response) throws IOException {
request = null;
mApi.refreshUserToken(...)
.subscribeOn(mSchedulerProvider.io())
.observeOn(mSchedulerProvider.ui())
.doOnSubscribe(d -> mDisposables.add(d))
.subscribe(tokenResponse -> {
if(tokenResponse.isSuccessful()) {
saveUserToken(tokenResponse.body());
request = response.request().newBuilder()
.header("Authorization", getUserAccessToken())
.build();
} else {
logoutUser();
}
},error -> {
},() -> {});
mDisposables.clear();
stop();
return request;
}
我的日志:
Error:(55, 16) error: Found a dependency cycle:
com.yasinkacmaz.myapp.service.APIService is injected at com.yasinkacmaz.myapp.darkvane.modules.NetworkModule.provideTokenAuthenticator(…, mApi, …)
com.yasinkacmaz.myapp.service.token.TokenAuthenticator is injected at
com.yasinkacmaz.myapp.darkvane.modules.NetworkModule.provideOkHttpClient(…, tokenAuthenticator, …)
okhttp3.OkHttpClient is injected at
com.yasinkacmaz.myapp.darkvane.modules.NetworkModule.provideRetrofit(…, okHttpClient)
retrofit2.Retrofit is injected at
com.yasinkacmaz.myapp.darkvane.modules.NetworkModule.provideAPI(retrofit)
com.yasinkacmaz.myapp.service.APIService is provided at
com.yasinkacmaz.myapp.darkvane.components.ApplicationComponent.exposeAPI()
所以我的问题是:我的TokenAuthenticator 课程取决于APIService,但我需要在创建APIService 时提供TokenAuthenticator。这会导致依赖循环错误。我该如何解决这个问题,有没有人面临这个问题?
提前致谢。
【问题讨论】:
-
因为它没有意义... OkHttpClient 与 TokenAuthenticator 用于获取 TokenAuthenticator 所需的身份验证令牌...它具有“循环依赖”甚至“在纸上”...创建另一个服务来获取身份验证令牌与另一个没有身份验证器的 http 客户端实例
-
TokenAuthenticator 用于刷新用户令牌,我想为每个网络调用使用相同的 OkHttp 实例。因为管理用户令牌。我在那个 OkHttp 实例上有调度员
-
再一次,它没有意义......即使你修复它,它也会导致stackoverflow......你从
authenticate调用refreshUserToken......但是refreshUserToken需要致电authenticate -
@Selvin Authenticate 在我收到 401 错误代码时工作,然后我使用 refreshUserToken 刷新我的令牌,然后继续我的工作。 refreshUserToken 方法不需要调用 authenticate
-
refreshUserToken 正在使用 OkHttpClient,它设置为使用正在使用 refreshUserToken 的 TokenAuthenticator ... refreshUserToken 方法不需要调用 authenticate 可以是真的吗?
标签: android dependency-injection retrofit2 dagger-2 rx-java2