我正在使用Retrofit和Dagger2。我已经实现了OkHttp Interceptor
,用于添加oauth token 。在没有oauth token 或时间戳无效的情况下,我将在执行实际请求之前(通过Retrofit服务)请求一个新 token 。
这将创建一个依赖周期,其中Retrofit服务需要Interceptor
,但是Interceptor
也需要Retrofit服务(用于检索oauth token )。Interceptor
的示例(为简化起见,它总是通过restService#refreshAccessToken
请求 token ):
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
Request.Builder requestBuilder = originalRequest.newBuilder();
String authHeader = "Bearer " + restService.refreshAccessToken();
requestBuilder.addHeader("Authorization", authHeader);
return chain.proceed(requestBuilder.build());
}
最佳答案
您的Interceptor
将需要将自身插入Interceptor#intercept()
方法。这样,您的翻新服务(包括带有添加的拦截器的OkHttpClient
)的依赖关系就可以得到满足,而无需依赖周期。
我的NetworkComponent
(提供我的翻新服务)位于Application
类中。这是使用Application Context
注入(inject)它的示例。
public class AuthInterceptor implements Interceptor {
@Inject RestService restService;
public AuthInterceptor(Context context) {
mContext = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
// Inject Retrofit service
((MyApplication) context.getApplicationContext())
.getNetworkComponent().inject(this);
Request originalRequest = chain.request();
Request.Builder requestBuilder = originalRequest.newBuilder();
String authHeader = "Bearer " + restService.refreshAccessToken();
requestBuilder.addHeader("Authorization", authHeader);
return chain.proceed(requestBuilder.build());
}
}
您也可以只设置一个局部变量而不必注入(inject)整个类,这样可能会获得更好的性能。
RestService restService = InjectHelper.getNetworkComponent(mContext).restService();
关于android - 使用OkHttpClient的OkHttp拦截器,没有依赖周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33632906/