Android中利用观察者模式对UrlConnection进行封装

本文介绍了一个简单的HTTP工具类实现,该工具类支持GET和POST请求,并通过异步任务处理网络请求,以避免阻塞主线程。同时,它还提供了一个回调接口以便于处理请求的成功与失败情况。
public class HttpUtils
{
	private HttpCallback httpCallback; // 访问接口后的回调
	private String path; // 接口路径
	private String method; // 访问的方法
	private Map<String, String> data;
	private String content = "";
	private MyTask myTask;

	public HttpUtils(HttpCallback httpCallback, String path, String method,
			Map<String, String> data)
	{
		super();
		this.httpCallback = httpCallback;
		this.path = path;
		this.method = method;
		this.data = data;
		myTask = new MyTask();
	}
	public void excute(){
		myTask.execute(method);
	}

	private class MyTask extends AsyncTask<String, Integer, String>
	{

		@Override
		protected String doInBackground(String... params)
		{
			if (method.equals("POST"))
			{
				return doPostByUrlConnection();
			} else if (method.equals("GET"))
			{
				return doGetByUrlConnection();
			}
			return null;
		}

	}

	private String doPostByUrlConnection()
	{
		URL url = null;
		StringBuffer parms = new StringBuffer();
		for(Map.Entry<String, String> entry: data.entrySet()){
				parms.append(entry.getKey()+"="+entry.getValue() +"&");
		}
		if (data.size() != 0)
		{
			parms.deleteCharAt(parms.length() - 1);
		}
		byte datas[] = parms.toString().getBytes();
		try
		{
			url = new URL(path);
			System.out.println("path :"+path);
		} catch (MalformedURLException e)
		{
			e.printStackTrace();
		}
		HttpURLConnection urlConnection = null;
		try
		{
			urlConnection = (HttpURLConnection) url.openConnection();
			urlConnection.setDoInput(true);
			urlConnection.setDoOutput(true);
			urlConnection.setRequestMethod("POST");
			OutputStream outputStream;
			outputStream = urlConnection.getOutputStream();
			outputStream.write(datas);
			AndroidTools.logS("PostCODE: " + urlConnection.getResponseCode());
			if (urlConnection.getResponseCode() == 200)
			{
				InputStream inputStream = urlConnection.getInputStream();
				BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
				content = reader.readLine();
				httpCallback.Success(content);
			}else {
				httpCallback.Failed("服务器连接不稳定,请稍后再试");
			}
		} catch (IOException e)
		{
				httpCallback.Failed("网络连接失败,请稍后再试");
		}
		return content;
	}

	private String doGetByUrlConnection()
	{
		URL url = null;
		StringBuffer parms = new StringBuffer();
		parms.append(path);
		parms.append("?");
		for (Map.Entry<String, String> entry : data.entrySet())
		{
			parms.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
		}
		if (data.size() != 0)
		{
			parms.deleteCharAt(parms.length() - 1);
		}
		System.out.println(path);
		try
		{
			url = new URL(parms.toString());
		} catch (MalformedURLException e)
		{
			e.printStackTrace();
		}
		HttpURLConnection urlConnection;
		try
		{
			urlConnection = (HttpURLConnection) url.openConnection();
			urlConnection.setRequestMethod("GET");
			AndroidTools.logS("GETCODE: " + urlConnection.getResponseCode());
			if (urlConnection.getResponseCode() == 200)
			{
				InputStream inputStream = urlConnection.getInputStream();
				BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
				content = reader.readLine();
				httpCallback.Success(content);
			}
		} catch (IOException e)
		{
			httpCallback.Failed("网络连接失败,请稍后再试");
			e.printStackTrace();
		}
		return null;
	}
}
public interface HttpCallback
{
		public void Success(String success);
		public void Failed(String failed);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值