我正在使用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/

10-10 23:20