学安卓的时候发现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() {
//当在过程中发生异常的时候执行,比如网络超时等
}
}
有什么可以优化的地方还望大家指出
分享到:
相关推荐
Android AsyncTask用法和异步加载图片通过AsyncTask 从网络上异步加载一张图片
Android 使用AsyncTask异步更新UI界面
AsyncTask_简单演示AsyncTask异步操作,写一个简单的AsyncTask异步操作解决上一篇文章提到的线程阻塞问题,对应我的博客《网易博客迁移:Android专题之AsyncTask(二)简单演示AsyncTask异步操作》,有问题欢迎留言...
http://blog.csdn.net/rwyz1314/article/details/6841639 的代码。放在这里做为备份。上一个文件传错了。也没法删除。只好重新传一个。
Android AsyncTask异步处理下载网页
AsyncTask实例代码演示Android异步任务.txt AsyncTask实例代码演示Android异步任务.txt
Android异步任务下载一张图片,关键是异步任务的流程,带进度条的异步任务
本压缩包主要包括一个AsyncTask异步请求的demo,以及一个讲解AsyncTask流程及用法的文档说明,希望能帮到你
通过AsyncTask 从网络上异步加载一张图片
HttpClient与Asynctask与服务器的结合使用
Android异步处理二:使用AsyncTask异步更新UI界面。
Android Handler AsyncTask 异步加载
Android是单线程模型,耗时的操作必须放在非主线程中执行,对此,我们需要使用多线程/线程池或者AsyncTask等来完成异步加载任务。 博客地址:http://blog.csdn.net/chenzheng8975/article/details/53893666
本文简单介绍了如何使用异步线程实现手机与其他服务器端接口进行通讯
Android利用异步任务AsyncTask 发送post请求并获取son字符串
AsyncTask android 异步 实例
基于Android的AsyncTask异步任务, Android的AsyncTask将复杂的数据处理交由子线程, 将处理过程交由主线程处理
在实际的开发中过程,我们可能经常要求应用程序做一些“耗时操作”,例如网络下载,加载大量资源等。这时候我们就不能直接在UI线程中(主线程)中去完成这些“耗时操作”,因为,UI线程主要是用来更新界面UI,如果一次...
HttpClient异步请求数,使用了Asynctask
主要介绍了Android 中使用 AsyncTask 异步读取网络图片的相关资料,需要的朋友可以参考下