android AsyncTask和HttpURLConnection结合,简单模仿android开源框架andorid-async-http

本文详细介绍了如何通过定义回调接口、配置HttpConnectionBean、继承AsyncTask并实现网络请求及回调处理,最终在Activity中调用完成网络操作的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      这里不是重复造轮子,只是努力地去学习轮子构建过程……

       因为水平太有限,很多细节没考虑,只当自己练手了……


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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值