Java tutorial
/* * @(#)RetryHandler.java Project:androidkit * Date:2013-5-8 * * Copyright (c) 2013 CFuture09, Institute of Software, * Guangdong Ocean University, Zhanjiang, GuangDong, China. * All rights reserved. * * 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.lurencun.cfuture09.androidkit.http.async; import android.os.SystemClock; import com.githang.androidkit.utils.Log4AK; 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 java.io.IOException; import java.io.InterruptedIOException; import java.net.SocketException; import java.net.UnknownHostException; import java.util.HashSet; import javax.net.ssl.SSLException; /** * ??android-async-http?? * * @author Geek_Soledad <a target="_blank" href= * "http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=XTAuOSVzPDM5LzI0OR0sLHM_MjA" * style="text-decoration:none;"><img src= * "http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_01.png" * /></a> */ public class RetryHandler implements HttpRequestRetryHandler { private static final Log4AK log = Log4AK.getLog(RetryHandler.class); /** * ? */ 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(); log.w(exception); } return retry; } protected boolean isInList(HashSet<Class<?>> list, Throwable tr) { for (Class<?> clazz : list) { if (clazz.isInstance(tr)) { return true; } } return false; } }