package com.michael.doubanonline.http;
import java.util.HashMap;
import org.apache.http.Header;
import android.content.Context;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.michael.doubanonline.MyApplication;
import com.michael.doubanonline.util.L;
import com.michael.doubanonline.util.ToastUtil;
/**
* 封装一个线程,这个线程负责所有基本的网络请求。外部通过传递接口名和参数进来实现访问
*
* */
public class RequestTask
{
/** 服务器异常提醒的内容 */
public static String SERVER_ERROR = "服务器异常";
/** 服务器正常的状态码 */
public static int SUCCESS = 200;
/** 超时的时间 */
public static final int TIME_OUT = 30000;
private Context context;
private String logCatTip;
private AsyncHttpClient asyncHttpClient;
private OnTaskResultListener task;
public RequestTask(Context context, String logCatTip)
{
this.context = context;
this.logCatTip = logCatTip;
}
/**
* 设置对所发起请求的回调监听
* */
public void setOnTaskResultListener2(OnTaskResultListener task2)
{
this.task = task2;
}
/**
* 回调接口
* */
public interface OnTaskResultListener
{
public void onStart();
public void onSuccess(String jsonResponse);
public void onFail(String message);
public void onFinish();
}
/**
* 发起请求
*
* */
public <T> T request(String action, HashMap<String, String> map)
{
request(action, new RequestParams(map));
return null;
}
/**
* 发起请求
*
* */
public <T> T request(String action, RequestParams params)
{
if (action == null || action.equals(""))
{
ToastUtil.show("接口不能为空:"+action);
return null;
}
String url = MyApplication.IP + action + "?apikey="+MyApplication.apikey+"&";// +params.toString();
L.e("*****URL*****", url+params.toString());
asyncHttpClient = new AsyncHttpClient();
asyncHttpClient.setCookieStore(MyApplication.myCookieStore);
asyncHttpClient.setTimeout(TIME_OUT);
asyncHttpClient.setMaxRetriesAndTimeout(1, TIME_OUT);
asyncHttpClient.get(url, params, new AsyncHttpResponseHandler() {//这里用get才可以!!!用post提示时间格式错误
@Override
public void onStart()
{
if (context != null)
{
L.e("*****onStart*****", "" + logCatTip);
if (task != null)
{
task.onStart();
}
}
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response)
{
if (context != null)
{
L.e("*****onSuccess*****", "" + logCatTip);
String result = new String(response);
L.e("*****onSuccess*****", result);
if (statusCode == RequestTask.SUCCESS)
{
if (task != null)
{
task.onSuccess(result);
}
}
else
{
onLoadFail("网络请求失败,请检查网络");
}
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error)
{
if (context != null)
{
if(responseBody != null)
{
L.e("*****onFailure*****", "statusCode:" + statusCode+" responseBody:"+new String(responseBody)+" error:"+error);
}
onLoadFail("对不起,请求失败 StatusCode:"+statusCode);
}
}
@Override
public void onFinish()
{
if (context != null)
{
L.e("*****onFinish*****", "" + logCatTip);
if (task != null)
{
task.onFinish();
}
}
}
/**
* 加载失败的时候界面所做的调整
* */
private void onLoadFail(String message)
{
ToastUtil.show(message);
if (task != null)
{
task.onFail(message);
}
}
});
return null;
}
/**
* 取消线程
* */
public void cancelRequest()
{
asyncHttpClient = null;
}
}