package com.wisedu.scc.love.widget.http;
import android.util.Log;
import com.loopj.android.http.AsyncHttpRequest;
import com.loopj.android.http.ResponseHandlerInterface;
import com.wisedu.scc.love.utils.ReflectUtil;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.AbstractHttpClient;
import org.apache.http.protocol.HttpContext;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class AutoHttpRequest extends AsyncHttpRequest {
private final static String TAG = "AutoHttpRequest";
private final static boolean DEBUG = true;
private final ResponseHandlerInterface responseHandler;
private final HttpManager.HttpConfig mHttpConfig;
private static Field IS_FINISH_FIELD;
private static Method MAKE_REQUEST_WITH_RETRIES_ENTITY;
public AutoHttpRequest(AbstractHttpClient client, HttpContext context,
HttpUriRequest request, ResponseHandlerInterface responseHandler,
HttpManager.HttpConfig httpConfig) {
super(client, context, request, responseHandler);
this.responseHandler = responseHandler;
this.mHttpConfig = httpConfig;
IS_FINISH_FIELD = ReflectUtil.getField(getClass(), "isFinished");
IS_FINISH_FIELD.setAccessible(true);
MAKE_REQUEST_WITH_RETRIES_ENTITY = ReflectUtil.getMethod(getClass(),
"makeRequestWithRetries");
MAKE_REQUEST_WITH_RETRIES_ENTITY.setAccessible(true);
}
public void setFinished(boolean value) {
try {
IS_FINISH_FIELD.set(this, value);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public void invokemakeRequestWithRetries() {
try {
MAKE_REQUEST_WITH_RETRIES_ENTITY.invoke(this);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void run() {
final HttpManager.HttpConfig config = mHttpConfig;
Log.v(TAG, config.getPrefix());
if (responseHandler instanceof AutoHttpResponseHandler) {
AutoHttpResponseHandler handler = ((AutoHttpResponseHandler) responseHandler);
handler.setRetryRequest(true);
handler.setHttpConfig(config);
}
if (isCancelled()) {
return;
}
if (responseHandler != null) {
responseHandler.sendStartMessage();
}
if (isCancelled()) {
return;
}
boolean isInterrupt = true;
while (isInterrupt) {
Log.v(TAG, "run...");
try {
invokemakeRequestWithRetries();
} catch (Exception e) {
e.printStackTrace();
if (e.getCause() != null
&& e.getCause().getCause() != null
&& e.getCause().getCause().getMessage() != null
&& e.getCause().getCause().getMessage()
.contains(AutoHttpResponseHandler.MSG)) {
if (DEBUG)
Log.v(TAG, "ready try again...");
if (isCancelled()) {
return;
}
continue;
} else {
if (!isCancelled() && responseHandler != null) {
responseHandler.sendFailureMessage(0, null, null, e);
} else {
Log.e("AsyncHttpRequest",
"makeRequestWithRetries returned error, but handler is null",
e);
}
}
}
isInterrupt = false;
if (isCancelled()) {
return;
}
}
if (responseHandler != null) {
responseHandler.sendFinishMessage();
}
setFinished(true);
}
}