RetryInterceptor.java 源代码
package activity.cloud.re;
import java.io.IOException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class RetryInterceptor implements Interceptor {
private static int maxRetry = 2;
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
RetryWrapper proceed = proceed(chain);
while (proceed.isNeedReTry()) {
proceed.retryNum++;
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
proceed(chain, proceed.request, proceed);
}
return proceed.response == null ? chain.proceed(chain.request()) : proceed.response;
}
private RetryWrapper proceed(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
RetryWrapper retryWrapper = new RetryWrapper(request, maxRetry);
proceed(chain, request, retryWrapper);
return retryWrapper;
}
private void proceed(Interceptor.Chain chain, Request request, RetryWrapper retryWrapper) throws IOException {
try {
retryWrapper.setResponse(chain.proceed(request));
} catch (SocketException | SocketTimeoutException unused) {
}
}
public static class RetryWrapper {
private int maxRetry;
Request request;
Response response;
volatile int retryNum = 0;
RetryWrapper(Request request, int i) {
this.request = request;
this.maxRetry = i;
}
public void setResponse(Response response) {
this.response = response;
}
Response response() {
return this.response;
}
Request request() {
return this.request;
}
boolean isSuccessful() {
Response response = this.response;
return response != null && response.isSuccessful();
}
boolean isNeedReTry() {
return !isSuccessful() && this.retryNum < this.maxRetry;
}
public void setRetryNum(int i) {
this.retryNum = i;
}
public void setMaxRetry(int i) {
this.maxRetry = i;
}
}
}