这是我的非法检查拦截器代码。
class UnauthorizedInterceptor implements Interceptor {
private Context context;
UnauthorizedInterceptor(Context context) {
this.context = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
Log.e("response: ", response.body().string()); // creating problem
ObjectMapper objectMapper = new ObjectMapper();
ServerResponse serverResponse = objectMapper.readValue(response.body().string(), ServerResponse.class);
if (serverResponse.getErrorCode() == 401) {
throw new UnauthorizedException(R.string.unauthorized_user);
} else {
return response;
}
}
private class UnauthorizedException extends IOException {
UnauthorizedException(final int stringRes) {
super(context.getString(stringRes));
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, stringRes, Toast.LENGTH_SHORT).show();
}
});
}
}
}
如果我在Interceptor中使用Log.e
,那么我在Retrofit成功回调中没有得到任何响应。但Log.e
正确地在logcat中打印响应。之后,它没有给Retrofit成功回调任何回调。它转到错误回调并给出IllegalStateException:closed
。
但如果我在拦截器中注释掉Log.e
代码,那么它的工作正常。
为什么会这样?任何人都可以解释这件事。
提前致谢。
答案 0 :(得分:1)
您一次只能拨打SELECT *
FROM Table
WHERE (CASE WHEN ClientPlants = 621 AND Carriers IN (226) THEN 1
WHEN Carriers IN (226) THEN 1
ELSE 0
END) = 1
ORDER BY ClientPlantsK;
1次
这样做时,它会消耗内部变量,所以之后它们就是空的
因此,您应该将该调用的值保存到变量中,然后在从中获取信息/记录它时使用它。
答案 1 :(得分:0)
这是response.body()
方法的文档:
如果此响应传递给{@link,则返回非null值 回调#onResponse}或从{@link Call#execute()}返回。响应 机构必须{@linkplain ResponseBody关闭}并且可能被消费 只有一次。
从{@ link#cacheResponse},{@ link #networkResponse}和{@link #priorResponse()}返回的响应总是返回null。
我也在添加Github问题链接。这将有助于您更多地解决此问题。