Java tutorial
/* * Copyright (c) 2014,KJFrameForAndroid Open Source Project,. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.louding.frame.http.download; import java.io.IOException; import java.io.InterruptedIOException; import java.net.SocketException; import java.net.UnknownHostException; import java.util.HashSet; import javax.net.ssl.SSLException; import org.apache.http.NoHttpResponseException; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.protocol.ExecutionContext; import org.apache.http.protocol.HttpContext; import android.os.SystemClock; /** * ???<br> * * <b></b> 2014-8-14 * * @author kymjs(kymjs123@gmail.com) * @version 1.0 */ public class RetryHandler implements HttpRequestRetryHandler { /** * ? */ private static final int RETRY_SLEEP_TIME_MILLIS = 1500; /** * ???? */ private static HashSet<Class<?>> exceptionWhitelist = new HashSet<Class<?>>(); /** * ????? */ private static HashSet<Class<?>> exceptionBlacklist = new HashSet<Class<?>>(); static { // ??? exceptionWhitelist.add(NoHttpResponseException.class); // ??WI-FI3G exceptionWhitelist.add(UnknownHostException.class); // ??WI-FI3G exceptionWhitelist.add(SocketException.class); // ??? exceptionBlacklist.add(InterruptedIOException.class); // SSL?????? exceptionBlacklist.add(SSLException.class); } /** * */ private final int maxRetries; public RetryHandler(int maxRetries) { this.maxRetries = maxRetries; } @Override public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { // ?? boolean retry = true; // ? Boolean b = (Boolean) context.getAttribute(ExecutionContext.HTTP_REQ_SENT); boolean sent = (b != null && b.booleanValue()); if (executionCount > maxRetries) { // ???? retry = false; } else if (isInList(exceptionBlacklist, exception)) { // ?????? retry = false; } else if (isInList(exceptionWhitelist, exception)) { // ???? retry = true; } else if (!sent) { // ????? retry = true; } if (retry) { // resend all idempotent requests HttpUriRequest currentReq = (HttpUriRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST); String requestType = currentReq.getMethod(); retry = !requestType.equals("POST"); } if (retry) { SystemClock.sleep(RETRY_SLEEP_TIME_MILLIS); } else { exception.printStackTrace(); } return retry; } protected boolean isInList(HashSet<Class<?>> list, Throwable tr) { for (Class<?> clazz : list) { if (clazz.isInstance(tr)) { return true; } } return false; } }