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

基于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() {
		//当在过程中发生异常的时候执行,比如网络超时等
	}

}



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




分享到:
评论

相关推荐

    httpclient-4.3.6.jar包,安卓异步框架必备

    总之,`httpclient-4.3.6.jar`是Android开发中进行HTTP请求的重要库,它提供了丰富的功能和优秀的性能,是开发者构建异步网络请求不可或缺的工具。正确理解和使用HttpClient,能够提升应用的网络性能,提供更好的...

    HttpClient异步请求数据

    总结起来,HttpClient异步请求数据涉及到的关键点有:HttpClient的使用、HttpGet/HttpPost请求的构建、HttpResponse的处理,以及如何结合Asynctask实现异步操作,确保不阻塞UI线程。在现代Android开发中,虽然...

    Http异步网络访问框架

    总的来说,Android的Http异步网络访问框架是开发者处理网络请求的重要工具,尤其是当处理大数据量时,异步访问可以显著提升应用的响应速度和用户体验。HttpClient和AsyncHttpClient等库提供了丰富的功能和优秀的性能...

    android 异步访问网络

    本文将深入探讨如何在Android中使用`HttpURLConnection`和`HttpClient`进行异步网络请求,以及如何利用开源工具包`android-async-http`简化这一过程。 1. **异步网络请求的重要性** 在Android中,由于主线程(UI...

    Android-HttpClient工具类简单轻松的实现getpostput和delete请求

    在Android开发过程中,网络请求是不可或缺的一部分,而`HttpClient`是一个强大的HTTP客户端库,它允许开发者执行各种HTTP操作,如GET、POST、PUT和DELETE。本篇文章将详细讲解如何使用`HttpClient`工具类来简化这些...

    Android HttpClient与Json解析

    在Android中,`AsyncTask`是最常见的异步处理工具之一。`AsyncTask`定义了三个泛型参数,分别代表输入参数类型、进度更新参数类型和结果参数类型。为了在后台执行HTTP请求并更新UI,你可以创建一个继承自`AsyncTask`...

    AndroidAsyncTaskHttp网络请求Demo

    `AndroidAsyncTaskHttp`是基于Android的`AsyncTask`和`HttpClient`的封装库,它简化了HTTP请求的过程,使得开发者能够更加便捷地进行网络操作。`AsyncTask`是Android提供的一个轻量级机制,用于在后台线程执行耗时...

    HttpClient

    - 确保处理好线程,网络请求不应在主线程中执行,避免ANR(Application Not Responding)错误,可使用AsyncTask或Retrofit等异步处理框架。 - 注意网络权限声明:`&lt;uses-permission android:name="android....

    android http同步与异步通讯包

    在Android应用开发中,网络通信是必不可少的一部分,用于获取服务器数据或者发送用户操作到服务器。本资源提供的"android ...通过研究和使用这些源码,你可以更好地理解和掌握Android中同步与异步网络请求的实现原理。

    异步加载图片(网络、本地)

    这个文件名暗示了可能包含一个基于Apache HttpClient的网络库。Apache HttpClient是一个强大的HTTP客户端,支持同步和异步请求,可以用于实现异步加载网络图片。它的特性包括连接池管理、重试策略、自定义请求头等...

    Android AsyncTask实现异步处理任务的方法详解

    Android AsyncTask是Android操作系统提供的一个工具类,用于实现异步处理任务的方法详解。AsyncTask是抽象类,定义了三种泛型类型 Params,Progress和Result。Params 是启动任务执行的输入参数,Progress 是后台任务...

    AsyncTask Demo

    在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,同时在主线...通过学习和理解这个Demo,开发者能够更好地掌握在Android应用中如何有效地执行异步任务,特别是在涉及网络请求和UI更新时。

    Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】

    首先,我们需要创建一个工具类`HttpClientUtil`,用于初始化和管理HttpClient对象。在静态块中创建`DefaultHttpClient`实例,这个类是HttpClient的核心,负责处理HTTP请求和响应。`sendRequest`方法接收URL和一个`...

    httpclient-4.5所需jar包.zip

    HttpClient 4.5是Java和Android开发中不可或缺的工具,它提供了强大的HTTP请求处理能力,优化了网络通信效率。理解并熟练运用HttpClient 4.5的特性,能够提升应用程序的网络性能,提高用户体验。在实际开发中,应...

    AsyncTask练习,下载图片

    在Android开发中,AsyncTask是一种常用的工具类,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免了主线程被阻塞,提供了更好的用户体验。本练习主要涉及AsyncTask的使用以及利用HttpClient进行网络图片...

    HTTPclient

    在实际应用中,HTTPClient可以与其他网络库或框架结合,如使用Gson或Jackson进行JSON数据解析,或者与AsyncTask或Retrofit结合进行异步请求处理。 提到的"ServletDemo"可能是指服务器端的Java Servlet技术。Servlet...

    Android HttpClientDemo

    通常我们会使用`AsyncTask`或者`Handler`,或者现代的`LiveData`、`RxJava`等异步处理工具来实现。例如,使用`AsyncTask`进行网络请求: ```java private class FetchDataTask extends AsyncTask, Void, String&gt; { ...

    Android中AsyncTask异步任务使用详细实例(一)

    在Android开发中,AsyncTask是一种常用的轻量级异步处理工具,尤其适用于那些需要在后台执行但需要更新UI的任务。AsyncTask允许开发者在后台线程执行耗时操作,如网络请求或数据库操作,同时能够安全地在UI线程中...

Global site tag (gtag.js) - Google Analytics