package com.appassit.http;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Set;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicNameValuePair;
import com.appassit.model.IBaseModel;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
public class HttpRequestHandler implements Runnable {
public static final int TIMEOUT_ERROR = 600;
public static final int BUSSINESS_ERROR = 610;
private RequestMethod requestMethod;
private WeakReference<ApiRequestListener> weakListener;
private String baseUrl;
private int code = 200;
private IBaseModel result = null;
// 用于确保和服务器加密的顺序一致
private ArrayList<BasicNameValuePair> list;
private Bundle cValues = new Bundle();
private HttpRequestHandler(String url, RequestMethod requestMethod, ApiRequestListener listener, Bundle values) {
init(url, requestMethod, listener, values);
}
private void init(String url, RequestMethod requestMethod, ApiRequestListener listener, Bundle values) {
this.baseUrl = url;
this.requestMethod = requestMethod;
if (listener != null) {
this.weakListener = new WeakReference<ApiRequestListener>(listener);
}
initParm(values);
}
private void initParm(Bundle values) {
list = new ArrayList<BasicNameValuePair>();
StringBuilder builder = new StringBuilder();
BasicNameValuePair bvp = null;
if (values == null || values.size() == 0) {
bvp = new BasicNameValuePair("sign_parm", "sign");
list.add(bvp);
builder.append(bvp.getValue());
} else {
Set<String> keys = values.keySet();
for (String key : keys) {
if (values.get(key) == null)
continue;
String value = values.get(key).toString();
if (TextUtils.isEmpty(value)) {
continue;
}
bvp = new BasicNameValuePair(key, value);
list.add(bvp);
builder.append(value);
}
cValues = values;
}
/*String sign = builder.toString();
String code = Md5Utils.strCode(Md5Utils.getMD5(sign));
code = code.substring(0, code.length() - 1);
list.add(new BasicNameValuePair("sign", code));*/
builder = null;
}
@Override
public void run() {
HttpUriRequest request = null;
HttpResponse response = null;
try {
request = ApiRequestFactory.getRequest(baseUrl, requestMethod, list);
response = HttpClientFactory.getHttpClient().execute(request);
final int statusCode = response.getStatusLine().getStatusCode();
if (HttpStatus.SC_OK == statusCode) {
result = ApiResponseFactory.getResponse(baseUrl, response);
if (result == null) {
code = BUSSINESS_ERROR;
} else {
sendMessageAtFrontOfUIQueue();
return;
}
} else {
code = statusCode;
}
} catch (IOException e) {
e.printStackTrace();
code = TIMEOUT_ERROR;
} catch (Exception e) {
e.printStackTrace();
code = BUSSINESS_ERROR;
} finally {
// release the connection
if (request != null) {
request.abort();
}
if (response != null) {
try {
HttpEntity entity = response.getEntity();
if (entity != null) {
entity.consumeContent();
}
} catch (IOException e) {
e.printStackTrace();
}
}
if (code != 200) {
sendMessageAtFrontOfUIQueue();
}
}
}
private static Handler sHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
if (msg == null || msg.obj == null || !(msg.obj instanceof HttpRequestHandler))
return;
HttpRequestHandler handler = (HttpRequestHandler) msg.obj;
if (handler.weakListener != null) {
ApiRequestListener listener = handler.weakListener.get();
if (listener != null) {
listener.onDataReady(handler.cValues, handler.baseUrl, handler.code, handler.result);
}
}
handler.recyle();
}
};
private void sendMessageAtFrontOfUIQueue() {
Message msg = Message.obtain();
msg.obj = this;
sHandler.sendMessageAtFrontOfQueue(msg);
}
private HttpRequestHandler next;
private static HttpRequestHandler sHeader;
private static final int MAX_COUNT = 10;
private static int sCount = 0;
private static Object sLock = new Object();
public static HttpRequestHandler obtain(String url, RequestMethod requestMethod, ApiRequestListener handler, Bundle values) {
if (sHeader != null) {
synchronized (sLock) {
if (sHeader != null) {
HttpRequestHandler head = sHeader;
sHeader = head.next;
head.next = null;
sCount--;
head.init(url, requestMethod, handler, values);
return head;
}
}
}
return new HttpRequestHandler(url, requestMethod, handler, values);
}
private void recyle() {
reset();
if (sCount > MAX_COUNT) {
return;
}
synchronized (sLock) {
next = sHeader;
sHeader = this;
sCount++;
}
}
private void reset() {
code = 200;
baseUrl = null;
result = null;
weakListener = null;
if (cValues != null) {
cValues.clear();
}
if (list != null) {
list.clear();
list = null;
}
};
}