学安卓的时候发现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;
};
}
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() {
//当在过程中发生异常的时候执行,比如网络超时等
}
}
有什么可以优化的地方还望大家指出