`
Dikaros
  • 浏览: 3386 次
文章分类
社区版块
存档分类
最新评论

基于AsyncTask和HttpClient的安卓异步网络工具

 
阅读更多

学安卓的时候发现AsyncTask挺好用的,所以就做了个基于基于HttpClient(post方法)和Asynctask的小工具,方便之后访问网络的操作


首先AsyNet抽象类,他继承了AsyncTask其中默认前两个泛型为String,第三个泛型与doInBackground的返回值有关所以就设置为T

package com.dikaros.asynchronous;

import java.util.HashMap;

import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;

/**
 * 
 * @author Dikaros
 * @param <T>
 * 
 */
public abstract class AsyNet<T> extends AsyncTask<String, String, T> {

	/**
	 * 异步网络访问类
	 * @param url
	 * @param jsonFile
	 * @param code
	 */
	protected AsyNet(String url,String key, String jsonOrXmlFile,String code) {
		this.url = url;
		this.jsonOrXmlFile = jsonOrXmlFile;
		this.code = code;
		this.key = key;
		keyValuePair = null;
	}
	
	/**
	 * 异步网络访问类
	 * @param url
	 * @param keyValuePair
 	 * @param code
	 */
	protected AsyNet(String url,HashMap keyValuePair,String code) {
		this.url = url;
		this.keyValuePair = keyValuePair;
		this.code = code;
		jsonOrXmlFile=null;
		key=null;
	}
	
	
	
	/**
	 * 默认编码 UTF-8
	 */
	public static final String NET_DEFAULT = "UTF-8";
	/**
	 * UTF-8
	 */
	public static final String NET_UTF_8 = "UTF-8";
	/**
	 * GBK
	 */
	public static final String NET_GBK = "GBK";
	/**
	 * GB2312
	 */
	public static final String NET_GB2312 = "GB2312";
	
	

	// 编码
	protected String code = NET_DEFAULT;
	// 网络工具接口
	protected HttpClient client = new DefaultHttpClient();
	
	//发送的字段
	protected String jsonOrXmlFile;
	
	//访问地址
	protected String url;
	
	protected String key;
	
	protected HashMap<String,String> keyValuePair;
	
	protected OnNetStateChangedListener<T> onNetStateChangedListener;
	protected int type;
	

	
	
	@Override
	protected void onPreExecute() {
		if (onNetStateChangedListener==null) {
			return;
		}
		onNetStateChangedListener.beforeAccessNet();
	}
	
	@Override
	protected void onPostExecute(T result) {
		if (onNetStateChangedListener==null) {
			return;
		}
		if (result!=null) {
			onNetStateChangedListener.afterAccessNet(result);
		}
	}
	
	@Override
	protected void onCancelled() {
		if (onNetStateChangedListener==null) {
			return;
		}
		onNetStateChangedListener.whenException();
	}
	
	/**
	 * 执行访问,在onPostExcute方法中获取结果并对ui进行操作
	 */
	public void execute(){
		this.execute(url);
	}

	/**
	 * @return code
	 */
	public String getCode() {
		return code;
	}

	/**
	 * @param code 要设置的 code
	 */
	public void setCode(String code) {
		this.code = code;
	}

	
	/**
	 * 访问网络之后,可以进行ui操作
	 * @author Dikaros
	 *
	 */
	public interface OnNetStateChangedListener<T>{
		/**
		 * 在网络访问网络正常并成功返回信息的时候执行的方法<br>
		 * 可以在这里进行ui操作
		 * @param result 返回的信息
		 */
		public void afterAccessNet(T result);
		/**
		 * 在准备访问网络时执行的方法<br>
		 * 可以在这里设置进度条等ui提示用户等待
		 */
		public void beforeAccessNet();
		/**
		 * 当访问网络的过程中遇到了异常提前终止操作时执行的方法
		 */
		public void whenException();
		
	}

	/**
	 * 获取网络状态改变监听器
	 * @return onNetStateChangedListener
	 */
	public OnNetStateChangedListener<T> getOnNetStateChangedListener() {
		return onNetStateChangedListener;
	}

	/**
	 * 设置网络状态改变监听器
	 * @param onNetStateChangedListener 要设置的 onNetStateChangedListener
	 */
	public void setOnNetStateChangedListener(
			OnNetStateChangedListener<T> onNetStateChangedListener) {
		this.onNetStateChangedListener = onNetStateChangedListener;
	}

	/**
	 * @return jsonOrXmlFile
	 */
	public String getJsonOrXmlFile() {
		return jsonOrXmlFile;
	}

	/**
	 * @param jsonOrXmlFile 要设置的 jsonOrXmlFile
	 */
	public void setJsonOrXmlFile(String jsonOrXmlFile) {
		this.jsonOrXmlFile = jsonOrXmlFile;
		keyValuePair = null;
	}

	/**
	 * @return keyValuePair
	 */
	public HashMap<String, String> getKeyValuePair() {
		return keyValuePair;
	}

	/**
	 * @param keyValuePair 要设置的 keyValuePair
	 */
	public void setKeyValuePair(HashMap<String, String> keyValuePair) {
		this.keyValuePair = keyValuePair;
		jsonOrXmlFile=null;
	};
	
	
	
	
	
}


下面是NormalAsyNet.java,可以使用这个类进行网络数据的传输,
package com.dikaros.asynchronous;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;

import android.R.integer;
import android.util.Log;

public class NormalAsyNet extends AsyNet<String> {
<span style="white-space:pre">	</span>//构造方法,jsonOrXmlFile传入的是向网络发送的json或者xml数据
	public NormalAsyNet(String url, String key, String jsonOrXmlFile,
			String code) {
		super(url, key, jsonOrXmlFile, code);
		type = 1;
	}

	public NormalAsyNet(String url, HashMap keyValuePair, String code) {
		super(url, keyValuePair, code);
		type = 2;
	}

	@Override
	protected String doInBackground(String... params) {
		String url = params[0];
		// 声明使用HttpPost方法
		HttpPost post = new HttpPost(url);
		// 发送信息
		try {
			// 创建集合
			List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
			if (type == 1) {
				// 将需要向网络发送的信息传入集合
				list.add(new BasicNameValuePair(key, jsonOrXmlFile));
			} else if (type == 2) {
				for (String key : keyValuePair.keySet()) {
					list.add(new BasicNameValuePair(key, keyValuePair.get(key)));
				}
			}
			// 向网络以GBK编码格式发送信息
			post.setEntity(new UrlEncodedFormEntity(list, code));
			// 设置网络超时参数
			HttpParams httpParams = client.getParams();
			HttpConnectionParams.setConnectionTimeout(httpParams, 3000);
			HttpConnectionParams.setSoTimeout(httpParams, 5000);
			// 获取接受的信息
			HttpResponse response = client.execute(post);
			// 将接受的信息存入value
			String value = EntityUtils.toString(response.getEntity());
			return value;
		} catch (ClientProtocolException e) {
			Log.e("网络错误,端口异常", e.toString());
		} catch (IOException e) {
			Log.e("网络错误,io异常", e.toString());
		}

		catch (Exception e) {
			Log.e("其他网络问题", e.toString());
		}
		return null;
	}

}

下面是一个使用的示例

package com.dikaros.example;

import android.app.Activity;
import android.os.Bundle;

import com.dikaros.asynchronous.AsyNet;
import com.dikaros.asynchronous.AsyNet.OnNetStateChangedListener;
import com.dikaros.asynchronous.NormalAsyNet;
import com.dikaros.asynchronous.R;

/**
 * 
 * @author Dikaros
 * 
 */
public class ExampleActivity extends Activity implements OnNetStateChangedListener<String> {
	
	//声明
	AsyNet net;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//NormalAsyNet用于获取文字数据返回类型为json
		net = new NormalAsyNet(
				"http://127.0.0.1:8080/happydeliver/update/update.json","",
				"", AsyNet.NET_UTF_8);
		// 设置监听器,在网络访问后
		net.setOnNetStateChangedListener(this);
		// 执行,访问网络
		net.execute();
	}
	@Override
	public void afterAccessNet(String result) {
		//得到网络结果的时候
		if (result!=null) {
			
		}
		//最后把net置为空
		net = null;
		
	}
	@Override
	public void beforeAccessNet() {
		//在访问网络前的操作,比如设置进度条
	}
	@Override
	public void whenException() {
		//当在过程中发生异常的时候执行,比如网络超时等
	}

}



有什么可以优化的地方还望大家指出




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics