Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当通过拦截器刷新服务器令牌时,OkHttp请求正在泄漏_Android_Retrofit2_Rx Java2_Okhttp_Okhttp3 - Fatal编程技术网

Android 当通过拦截器刷新服务器令牌时,OkHttp请求正在泄漏

Android 当通过拦截器刷新服务器令牌时,OkHttp请求正在泄漏,android,retrofit2,rx-java2,okhttp,okhttp3,Android,Retrofit2,Rx Java2,Okhttp,Okhttp3,我使用RxJava和改型来执行OkHttp请求。我可以在Android Studio的网络探查器中看到我的请求被泄露了,因为它们使AsyncTask线程保持活动状态。它们没有响应,大小为空。我可以在network profiler的线程视图中看到原始请求、令牌请求和更新的请求。但最初的请求从未完成 在极端情况下,比如在QA环境中,由于某种原因,令牌每分钟刷新一次,线程池变满,不能再进行调用。我想我们可以调用chain.proceduce任意多次,但我认为错误仍然存在。以下是拦截器代码: priv

我使用RxJava和改型来执行OkHttp请求。我可以在Android Studio的网络探查器中看到我的请求被泄露了,因为它们使AsyncTask线程保持活动状态。它们没有响应,大小为空。我可以在network profiler的线程视图中看到原始请求、令牌请求和更新的请求。但最初的请求从未完成

在极端情况下,比如在QA环境中,由于某种原因,令牌每分钟刷新一次,线程池变满,不能再进行调用。我想我们可以调用chain.proceduce任意多次,但我认为错误仍然存在。以下是拦截器代码:

private static okhttp3.Interceptor oauthInterceptor = chain -> {
    OAuthToken token = OAuthToken.getOAuthToken();
    long initialTokenCreated = token.getCreatedUtc();

    Request request = changeTokenInRequest(chain.request(), token);
    Response response = chain.proceed(request);
    boolean forceTokenRefresh = false;

    if (initialTokenCreated != token.getCreatedUtc()) {
        // Then the token has been updated since we started this request
        request = changeTokenInRequest(chain.request(), token);
        response = chain.proceed(request);
    }

    String jsonType = "application/json";
    if (!response.body().contentType().toString().contains(jsonType)) {
        forceTokenRefresh = true;
    }

    // 401: Forbidden, 403: Permission denied
    if (forceTokenRefresh || ((response.code() == 401 || response.code() == 403)
            && OAuthToken.getOAuthToken().getRefreshToken() != null)) {
        OAuthToken refreshedToken = refreshToken();
        if (refreshedToken == null) {
            // Then there was a problem refreshing the token
            return response;
        }
        // Recreate the request with the new access token
        request = changeTokenInRequest(chain.request(), refreshedToken);
        return chain.proceed(request);
    } else {
        return response;
    }
};

protected static okhttp3.Request changeTokenInRequest(Request request, OAuthTokenBase token) {
    Headers.Builder builder = request.headers().newBuilder().removeAll("Authorization");
    if (!TextUtils.isEmpty(token.getTokenType()) && !TextUtils.isEmpty(token.getAccessToken())) {
        builder = builder.add("Authorization", token.getTokenType() + " " + token.getAccessToken());
    }
    request = request.newBuilder().headers(builder.build()).build();
    return request;
}
我就是这样打电话的:

public static Observable<ResultPaginatedReply<BasicUser>> getGroupsMembers(String type, String id, int page) {
    return getMsApiService().getGroupsMembers(type, id, page)
            .subscribeOn(Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR))
            .observeOn(AndroidSchedulers.mainThread());
}
publicstaticobserveablegetgroupsmembers(字符串类型、字符串id、int页){
返回getMsApiService().getGroupsMembers(类型、id、页面)
.subscribeOn(Schedulers.from(AsyncTask.THREAD\u POOL\u EXECUTOR))
.observeOn(AndroidSchedulers.mainThread());
}

结果表明,如果您没有像我一样在OkHttp中使用Authenticator类,那么在刷新令牌时必须手动关闭响应主体@DallinDyer的评论帮助了我

所以我补充说

            response.body().close();

在错误检查之后,瞧。

结果表明,如果您没有像我一样使用OkHttp中的Authenticator类,那么在刷新令牌时,您必须手动关闭响应主体@DallinDyer的评论帮助了我

所以我补充说

            response.body().close();
在错误检查之后,瞧