使用Android的AsyncTask

一、以下内容摘自网络:

AsyncTask定义了三种泛型类型 Params,Progress和Result。

Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
有必要的话你还得重写以下这三个方法,但不是必须的:

onProgressUpdate(Progress…)   可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute()        这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled()             用户调用取消时,要做的操作
使用AsyncTask类,以下是几条必须遵守的准则:

Task的实例必须在UI thread中创建;
execute方法必须在UI thread中调用;
不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
该task只能被执行一次,否则多次调用时将会出现异常;

二、下面是自己写的异步处理代码:

1.定义一个结果集类HttpResult,用来存储获取到的数据结果

import org.apache.http.Header;

public class HttpResult {
	private Header[] headers;
	private String result;
	
	public HttpResult(Header[] headers, String result) {
		super();
		this.headers = headers;
		this.result = result;
	}

	public Header[] getHeaders() {
		return headers;
	}

	public void setHeaders(Header[] headers) {
		this.headers = headers;
	}

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}
}


2.定义AsyncTask子类实现异步处理,这里实现doInBackground, onPostExecute, onPreExecute三个方法,其他有需要可以自行实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import android.content.Context;
import android.os.AsyncTask;

public class HttpAsyncTask extends AsyncTask<Void, Void, HttpResult> {
	private String url;	//查询链接
	private List<NameValuePair> parameters;	//链接参数
	private String sessionId;	//用于记录登录后的sessionId
	private Context context;
	private String preMethod;	//获取数据前的方法
	private String callBackMethod;	//回调方法
	private Object[] preMethodParam;	//preMethod对应参数
	private Object[] callBackParam;	//callBackMethod对应参数
	
	public HttpAsyncTask(Context context, String url, List<NameValuePair> parameters, String sessionId){
		super();
		this.context = context;
		this.url = url;
		this.parameters = parameters;
		this.sessionId = sessionId;
	}
	
	//后台线程执行,获取数据。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度
	@Override
	protected HttpResult doInBackground(Void... params) {
		BufferedReader reader = null;
		try {
			HttpParams httpParams = new BasicHttpParams();
			HttpConnectionParams.setConnectionTimeout(httpParams, 5000);	//设置超时时间
			HttpClient client = new DefaultHttpClient(httpParams);
			HttpPost httpPost = new HttpPost(url);
			if (sessionId != null && !"".equals(sessionId)) {
				httpPost.setHeader("Cookie", sessionId);
			}
			httpPost.setHeader("x-requested-with", "XMLHttpRequest");//模拟异步登录
			if (parameters != null) {
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "UTF-8");
				httpPost.setEntity(entity);
			}
			HttpResponse response = null;
			response = client.execute(httpPost);
			reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
			StringBuffer sb = new StringBuffer();
			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
				String content = reader.readLine();
				while (content != null) {
					sb.append(content);
					content = reader.readLine();
				}
			} else {
				sb.append("error");
			}
			return new HttpResult(response.getHeaders("set-cookie"), sb.toString());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}
	
	//在主线程执行,参数为doInBackground得到的结果,在这里执行回调函数
	@Override
	protected void onPostExecute(HttpResult result) {
		super.onPostExecute(result);
		if (getCallBackMethod() != null && !"".equals(getCallBackMethod())) {
			try {
				Class c = context.getClass();
				Class[] classes;
				int paramLength = 1;
				if (getCallBackParam() != null) {
					paramLength += getCallBackParam().length;
				}
				classes = new Class[paramLength];
				classes[0] = HttpResult.class;
				for (int i = 1; i < paramLength; i++) {
					classes[i] = getCallBackParam()[i - 1].getClass();
				}
				Method method = c.getMethod(getCallBackMethod(), classes);
				
				Object[] objects = new Object[paramLength];
				objects[0] = result;
				for (int i = 1; i < paramLength; i++) {
					objects[i] = getCallBackParam()[i - 1];
				}
				method.invoke(context, objects);
			} catch (Exception e) {
				//如果任务执行之前显示了进度条,在执行出错时要在这里关闭进度条
				e.printStackTrace();
			}
		}
	}
	
	//任务开始之前执行的方法,可用来显示进度条等
	@Override
	protected void onPreExecute() {
		if (getPreMethod() != null && !"".equals(getPreMethod())) {
			try {
				Class c = context.getClass();
				if (getPreMethodParam() == null) {
					c.getMethod(getPreMethod()).invoke(context);
				} else {
					Class[] classes = new Class[getPreMethodParam().length];
					for (int i = 0; i < getPreMethodParam().length; i++) {
						classes[i] = getPreMethodParam()[i].getClass();
					}
					c.getMethod(getPreMethod(), classes).invoke(context, getPreMethodParam());
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		super.onPreExecute();
	}
	
	public String getPreMethod() {
		return preMethod;
	}
	public void setPreMethod(String preMethod) {
		this.preMethod = preMethod;
	}
	public String getCallBackMethod() {
		return callBackMethod;
	}
	public void setCallBackMethod(String callBackMethod) {
		this.callBackMethod = callBackMethod;
	}
	public Object[] getPreMethodParam() {
		return preMethodParam;
	}
	public void setPreMethodParam(Object[] preMethodParam) {
		this.preMethodParam = preMethodParam;
	}
	public Object[] getCallBackParam() {
		return callBackParam;
	}
	public void setCallBackParam(Object[] callBackParam) {
		this.callBackParam = callBackParam;
	}
}


3.使用AsyncTask获取站点的数据并进行回调函数的处理

HttpAsyncTask asyncTask = new HttpAsyncTask(this, "http://127.0.0.1:8080/...", new ArrayList<NameValuePair>(), "");
		asyncTask.setCallBackMethod("doBack");
		asyncTask.execute();
回调函数定义
public void doBack(HttpResult result){
		System.out.println(result.getResult());
	}






使用Android的AsyncTask,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。