学安卓的时候发现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() {
//当在过程中发生异常的时候执行,比如网络超时等
}
}
有什么可以优化的地方还望大家指出
分享到:
相关推荐
总之,`httpclient-4.3.6.jar`是Android开发中进行HTTP请求的重要库,它提供了丰富的功能和优秀的性能,是开发者构建异步网络请求不可或缺的工具。正确理解和使用HttpClient,能够提升应用的网络性能,提供更好的...
总结起来,HttpClient异步请求数据涉及到的关键点有:HttpClient的使用、HttpGet/HttpPost请求的构建、HttpResponse的处理,以及如何结合Asynctask实现异步操作,确保不阻塞UI线程。在现代Android开发中,虽然...
总的来说,Android的Http异步网络访问框架是开发者处理网络请求的重要工具,尤其是当处理大数据量时,异步访问可以显著提升应用的响应速度和用户体验。HttpClient和AsyncHttpClient等库提供了丰富的功能和优秀的性能...
本文将深入探讨如何在Android中使用`HttpURLConnection`和`HttpClient`进行异步网络请求,以及如何利用开源工具包`android-async-http`简化这一过程。 1. **异步网络请求的重要性** 在Android中,由于主线程(UI...
在Android开发过程中,网络请求是不可或缺的一部分,而`HttpClient`是一个强大的HTTP客户端库,它允许开发者执行各种HTTP操作,如GET、POST、PUT和DELETE。本篇文章将详细讲解如何使用`HttpClient`工具类来简化这些...
在Android中,`AsyncTask`是最常见的异步处理工具之一。`AsyncTask`定义了三个泛型参数,分别代表输入参数类型、进度更新参数类型和结果参数类型。为了在后台执行HTTP请求并更新UI,你可以创建一个继承自`AsyncTask`...
`AndroidAsyncTaskHttp`是基于Android的`AsyncTask`和`HttpClient`的封装库,它简化了HTTP请求的过程,使得开发者能够更加便捷地进行网络操作。`AsyncTask`是Android提供的一个轻量级机制,用于在后台线程执行耗时...
- 确保处理好线程,网络请求不应在主线程中执行,避免ANR(Application Not Responding)错误,可使用AsyncTask或Retrofit等异步处理框架。 - 注意网络权限声明:`<uses-permission android:name="android....
在Android应用开发中,网络通信是必不可少的一部分,用于获取服务器数据或者发送用户操作到服务器。本资源提供的"android ...通过研究和使用这些源码,你可以更好地理解和掌握Android中同步与异步网络请求的实现原理。
这个文件名暗示了可能包含一个基于Apache HttpClient的网络库。Apache HttpClient是一个强大的HTTP客户端,支持同步和异步请求,可以用于实现异步加载网络图片。它的特性包括连接池管理、重试策略、自定义请求头等...
Android AsyncTask是Android操作系统提供的一个工具类,用于实现异步处理任务的方法详解。AsyncTask是抽象类,定义了三种泛型类型 Params,Progress和Result。Params 是启动任务执行的输入参数,Progress 是后台任务...
在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,同时在主线...通过学习和理解这个Demo,开发者能够更好地掌握在Android应用中如何有效地执行异步任务,特别是在涉及网络请求和UI更新时。
首先,我们需要创建一个工具类`HttpClientUtil`,用于初始化和管理HttpClient对象。在静态块中创建`DefaultHttpClient`实例,这个类是HttpClient的核心,负责处理HTTP请求和响应。`sendRequest`方法接收URL和一个`...
HttpClient 4.5是Java和Android开发中不可或缺的工具,它提供了强大的HTTP请求处理能力,优化了网络通信效率。理解并熟练运用HttpClient 4.5的特性,能够提升应用程序的网络性能,提高用户体验。在实际开发中,应...
在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免了主线程被阻塞,提供了更好的用户体验。本练习主要涉及AsyncTask的使用以及利用HttpClient进行网络图片...
在实际应用中,HTTPClient可以与其他网络库或框架结合,如使用Gson或Jackson进行JSON数据解析,或者与AsyncTask或Retrofit结合进行异步请求处理。 提到的"ServletDemo"可能是指服务器端的Java Servlet技术。Servlet...
通常我们会使用`AsyncTask`或者`Handler`,或者现代的`LiveData`、`RxJava`等异步处理工具来实现。例如,使用`AsyncTask`进行网络请求: ```java private class FetchDataTask extends AsyncTask, Void, String> { ...
在Android开发中,AsyncTask是一种常用的轻量级异步处理工具,尤其适用于那些需要在后台执行但需要更新UI的任务。AsyncTask允许开发者在后台线程执行耗时操作,如网络请求或数据库操作,同时能够安全地在UI线程中...