这里不是重复造轮子,只是努力地去学习轮子构建过程……
因为水平太有限,很多细节没考虑,只当自己练手了……
1.定义回调接口IPostExecuteCallBack
public interface IPostExecuteCallBack {
// 成功回调
public void onSuccessPostExecute(String content);
// 失败回调
public void onFailurePostExecute(String content);
}
2.定义HttpConnectionBean
public class HttpConnectionBean {
int method;
String url;
Map<String, String> headers;
Map<String, String> params;
public HttpConnectionBean(int method, String url, Map<String, String> headers,
Map<String, String> params) {
super();
this.method = method;
this.url = url;
this.headers = headers;
this.params = params;
}
public int getMethod() {
return method;
}
public void setMethod(int method) {
this.method = method;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, String> getHeaders() {
return headers;
}
public void setHeaders(Map<String, String> headers) {
this.headers = headers;
}
public Map<String, String> getParams() {
return params;
}
public void setParams(Map<String, String> params) {
this.params = params;
}
}
3.MyAsyncTask继承AsyncTask
在doInBackground执行网络操作,在onPostExecute执行回调操作
public class MyAsyncTask extends AsyncTask<Void, Integer, String> {
public MyAsyncTask() {
}
HttpConnectionBean connectionBean; // HttpURLConnection连接实体
IPostExecuteCallBack iPostExecuteCallBack; // 回调接口
public void request(HttpConnectionBean myconnectionBean,
IPostExecuteCallBack myiPostExecuteCallBack) {
connectionBean = myconnectionBean;
iPostExecuteCallBack = myiPostExecuteCallBack;
}
@Override
protected String doInBackground(Void... params) {
try {
return RequestHttpURLConnection.getConnection(
connectionBean.getMethod(), connectionBean.getUrl(),
connectionBean.getHeaders(), connectionBean.getParams());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
if (null != result) {
iPostExecuteCallBack.onSuccessPostExecute(result); // 返回值不为空,回调onSuccessPostExecute
} else {
iPostExecuteCallBack.onFailurePostExecute(result); // 返回值为空,回调onFailurePostExecute
}
super.onPostExecute(result);
}
/**
* 执行
*/
public void StartTask() {
this.execute();
}
}
4.RequestHttpURLConnection
public class RequestHttpURLConnection {
private static String TAG = "RequestHttpURLConnection";
public static String getConnection(int method, String url,
Map<String, String> headers, Map<String, String> params) throws Exception{
//每次网络操作前进行网络判断
if(NetUtils.netIsAvailable()){
switch (method) {
case Constant.POST:
HttpURLConnection connPost = (HttpURLConnection) HttpRequestUtil.sendPostRequest(url,
params,
headers);
if (null == connPost)
{
L.i(TAG, "连接网络失败");
return null;
}
else {
InputStream inStream = connPost.getInputStream();
byte[] data =read(inStream);
String json = new String(data);
return json;
}
case Constant.GET:
HttpURLConnection connGet = (HttpURLConnection) HttpRequestUtil.sendGetRequest(url,
params,
headers);
if (null == connGet)
{
L.i(TAG, "连接网络失败");
return null;
}
else {
InputStream inStream = connGet.getInputStream();
byte[] data =read(inStream);
String json = new String(data);
return json;
}
default:
break;
}
}
return null;
}
/**
* 读取输入流数据
* @param inStream
* @return
*/
public static byte[] read(InputStream inStream) throws Exception
{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1)
{
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}
5.HttpRequestUtil
/*
* 此类用来发送HTTP请求
* */
public class HttpRequestUtil
{
/**
* 发送GET请求
*
* @param url
* @param params
* @param headers
* @return
* @throws Exception
*/
private static final int TIMEOUT_IN_MILLIONS = 10*1000;
public static URLConnection sendGetRequest(String url,
Map<String, String> params, Map<String, String> headers)
throws Exception
{
StringBuilder buf = new StringBuilder(url);
Set<Entry<String, String>> entrys = null;
// 如果是GET请求,则请求参数在URL中
if (params != null && !params.isEmpty())
{
buf.append("?");
entrys = params.entrySet();
for (Map.Entry<String, String> entry : entrys)
{
buf.append(entry.getKey())
.append("=")
.append(URLEncoder.encode(entry.getValue(), "UTF-8"))
.append("&");
}
buf.deleteCharAt(buf.length() - 1);
}
URL url1 = new URL(buf.toString());
HttpURLConnection conn = (HttpURLConnection)url1.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
// 设置请求头
if (headers != null && !headers.isEmpty())
{
entrys = headers.entrySet();
for (Map.Entry<String, String> entry : entrys)
{
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
if (conn.getResponseCode() == 200)
{
return conn;
}
else
{
return null;
}
}
/**
* 发送POST请求
*
* @param url
* @param params
* @param headers
* @return
* @throws Exception
*/
public static URLConnection sendPostRequest(String url,
Map<String, String> params, Map<String, String> headers)
throws Exception
{
StringBuilder buf = new StringBuilder();
Set<Entry<String, String>> entrys = null;
// 如果存在参数,则放在HTTP请求体,形如name=aaa&age=10
if (params != null && !params.isEmpty())
{
entrys = params.entrySet();
for (Map.Entry<String, String> entry : entrys)
{
buf.append(entry.getKey())
.append("=")
.append(URLEncoder.encode(entry.getValue(), "UTF-8"))
.append("&");
}
buf.deleteCharAt(buf.length() - 1);
}
URL url1 = new URL(url);
byte[] entitydata = buf.toString().getBytes();//得到实体的二进制数据
HttpURLConnection conn = (HttpURLConnection)url1.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
if (headers != null && !headers.isEmpty())
{
entrys = headers.entrySet();
for (Map.Entry<String, String> entry : entrys)
{
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
OutputStream out = conn.getOutputStream();
out.write(buf.toString().getBytes("UTF-8"));
out.flush();
out.close();
if (conn.getResponseCode() == 200)
{
return conn;
}
else
{
return null;
}
}
}
6.使用
在CreateHttpURLConnectionBean中设置URL地址和传入请求参数
public class CreateHttpURLConnectionBean {
public static HttpConnectionBean getLoginCB(Map<String, String> params) throws Exception{
HttpConnectionBean connectionBean = new HttpConnectionBean(Constant.POST, "Your Url",
null,
params);
return connectionBean;
}
}
在HttpRequestParam中设置请求参数
public class HttpRequestParam {
public static Map<String, String> setLoginParam(String name, String pwd,
String client) {
Map<String, String> params = new HashMap<String, String>();
params.put("login_name", name);
params.put("password", pwd);
return params;
}
}
然后只需在Activity中写这几行代码就OK了
MyAsyncTask myAsyncTask = new MyAsyncTask(); //创建Async任务
Map<String, String> loginParaMap = HttpRequestParam.setLoginParam("name", "pwd"); //从UI得到参数
myAsyncTask.request(CreateHttpURLConnectionBean.getLoginCB(loginParaMap), new IPostExecuteCallBack(){
@Override
public void onSuccessPostExecute(String content) {
L.i(TAG, content);
}
@Override
public void onFailurePostExecute(String content) {
L.i(TAG, content);
}
});
//执行
myAsyncTask.StartTask();