接口 ILogicFlow
public interface ILogicFlow {
final int StatusInit = 0x01;
final int StatusStart = 0x02;
final int StatusSuccess = 0x03;
final int StatusFailed = 0x04;
final int StatusSuccessRetry = 0x05;
final int StatusFailedRetry = 0x06;
final int StatusTimeOut = 0x07;
void logicInit();
void logicStart();
void logicFailed();
void logicSuccess();
void logicFailedRetry();
void logicSuccessRetry();
void logicEnd();
}
SimpleAsyncHttpGetUtil 类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.http.HttpStatus;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
public class SimpleAsyncHttpGetUtil implements ILogicFlow {
private HandlerThread ht;
private Handler h;
private CallBack callBack;
private CallBackData callBackData = new CallBackData();
public SimpleAsyncHttpGetUtil(String url, int failedMaxRetryCount, CallBack callBack) {
ht = new HandlerThread("http");
ht.start();
h = new Handler(ht.getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
callBackData.status = msg.what;
switch (msg.what) {
case StatusInit:
logicInit();
break;
case StatusStart:
logicStart();
break;
case StatusFailedRetry:
logicFailedRetry();
break;
case StatusFailed:
logicFailed();
break;
case StatusSuccess:
logicSuccess();
break;
default:
break;
}
}
};
this.callBack = callBack;
callBackData.url = url;
callBackData.failedMaxRetryCount = failedMaxRetryCount;
}
public void execute() {
h.sendEmptyMessage(StatusInit);
}
private boolean retry_start() {
boolean b = false;
HttpURLConnection httpConn = null;
try {
httpConn = (HttpURLConnection) new URL(
callBackData.url).openConnection();
httpConn.setConnectTimeout(5000);
httpConn.setReadTimeout(5000);
httpConn.connect();
int statusCode = httpConn.getResponseCode();
if (HttpStatus.SC_OK == statusCode) {
InputStream is = httpConn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
StringBuffer lines = new StringBuffer();
while (null != (line = br.readLine())) {
lines.append(line);
}
br.close();
isr.close();
is.close();
callBackData.response = lines.toString();
b = true;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(httpConn != null){
httpConn.disconnect();
}
}
return b;
}
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
public int getStatus() {
return callBackData.status;
}
public static interface CallBack {
void onHttpInit(CallBackData cbd);
void onHttpStart(CallBackData cbd);
void onHttpFailedRetry(CallBackData cbd);
void onHttpFailed(CallBackData cbd);
void onHttpSuccess(CallBackData cbd);
}
public static class CallBackData {
public String url = new String();
public int status = StatusInit;
public int failedMaxRetryCount = 0;
public int failedRetryCount = 0;
public String response = new String();
public String toString() {
return String
.format("url=%s,status=%d,failedMaxRetryCount=%d,failedRetryCount=%d",
url, status, failedMaxRetryCount, failedRetryCount);
}
}
@Override
public void logicInit() {
if (null != callBack) {
callBack.onHttpInit(callBackData);
}
h.sendEmptyMessage(StatusStart);
}
@Override
public void logicStart() {
if (null != callBack) {
callBack.onHttpStart(callBackData);
}
if (retry_start()) {
h.sendEmptyMessage(StatusSuccess);
} else {
h.sendEmptyMessage(StatusFailedRetry);
}
}
@Override
public void logicFailed() {
if (null != callBack) {
callBack.onHttpFailed(callBackData);
}
logicEnd();
}
@Override
public void logicSuccess() {
if (null != callBack) {
callBack.onHttpSuccess(callBackData);
}
logicEnd();
}
@Override
public void logicFailedRetry() {
callBackData.failedRetryCount++;
if (callBackData.failedRetryCount <= callBackData.failedMaxRetryCount) {
if (null != callBack) {
callBack.onHttpFailedRetry(callBackData);
}
if (retry_start()) {
h.sendEmptyMessage(StatusSuccess);
} else {
h.sendEmptyMessage(StatusFailedRetry);
}
} else {
h.sendEmptyMessage(StatusFailed);
}
}
@Override
public void logicSuccessRetry() {
}
@Override
public void logicEnd() {
ht.quit();
ht = null;
h = null;
callBack = null;
callBackData = null;
}
}
用法
SimpleAsyncHttpGetUtil epgHttpUtil = new SimpleAsyncHttpGetUtil(EPG_URL, 2, mEpgCallback); epgHttpUtil.execute();