android 异步任务AsyncTask

异步任务AsyncTask

AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用。

AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法。注意继承时需要设定三个泛型Params,Progress和Result的类型,如AsyncTask<Void,Inetger,Void>:

  • Params是指调用execute()方法时传入的参数类型和doInBackgound()的参数类型一样
  • Progress是指更新进度时传递的参数类型,即于publishProgress()和onProgressUpdate()的参数类型一样
  • Result是指doInBackground()的返回值类型
上面的说明涉及到几个方法:
  • doInBackgound() 这个方法是继承AsyncTask必须要实现的,运行于后台,耗时的操作可以在这里做
  • publishProgress() 更新进度,给onProgressUpdate()传递进度参数(在UI主进程中,执行这个方法)
  • onProgressUpdate() 在publishProgress()调用完被调用,更新进度

异步任务所使用的三种类型:

  1. Params ,发送到任务的类型参数 执行。
  2. Progress进步的类型单位期间公布 后台计算。
  3. Result,背景的结果的类型 计算。







使用AsyncTask只要如下三步:

1、创建AsyncTask的类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,就可将他指定为void


2、根据需要实现AsyncTask的如下方法:

       (1)onPreExecute():该方法将在执行后台耗时操作doInBackground()方法前被调用。通常该方法用于完成一些初始化的准备工作,比如在界面上显示进度条等。

     
     (2)doInBackground(Params...):重写该方法就是,后台线程将要完成的耗时任务,该方法中不能修改UI。

     
     (3)onProgressUpdate(Progress...values):在doInBackground()该方法中调用publishProgress()方法更新任务的执行进度后,将会触发该方法,常常用于更新进度条。

     (4)onPostExecute(Result result):当doInBackground完成后系统会自动调用onPostExecute()方法,将oInBackground()方法的返回值传给该方法,用于更新UI,显示结果。

 
3、调用AsyncTask子类的实例execute(Params...params)开始执行耗时任务


使用AsyncTask时必须遵守如下规则:
  • 必须在UI线程中创建AsyncTask的exetue()方法。
  • 必须在UI线程中调用AsyncTask的实例
  • AsyncTask的onPerExecute()、onPostExecute(Result result)、doInBackground(Params....Params),onProgressUpdate(Progress...values)方法,不应该有程序员代码调用,而是有android系统负责调用。
  • 每个AsyncTask只能被执行一次,多次调用将会引发异常。

例子:
下面是Android AsyncTask的使用例子,后台执行的,带进度条。


package com.example.asynctestdemo;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {
	private Button bt_execute;
	private Button bt_cancel;
	private ProgressBar progressBar;
	private TextView textView;
	MyTask myTask;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		bt_execute = (Button) findViewById(R.id.bt_execute);
		bt_cancel = (Button) findViewById(R.id.bt_cancel);
		progressBar = (ProgressBar) findViewById(R.id.progressBar);
		textView = (TextView) findViewById(R.id.text_view);

		bt_execute.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// 实例化异步任务MyTask类
				myTask = new MyTask();
				myTask.execute("http://www.baidu.com");
			}
		});

		bt_cancel.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				myTask.cancel(true);
			}
		});

	}

	class MyTask extends AsyncTask<String, Integer, String> {

		// onpreExecute()方法用于,在执行后台任务前,做一些UI操作
		protected void onPreExecute() {
			textView.setText("Loading......");
		}

		// doInBackground()方法,内部执行后台耗时任务操作,但不是不能在此方法内修改UI
		protected String doInBackground(String... params) {
			try {
				HttpClient client = new DefaultHttpClient();
				HttpGet get = new HttpGet(params[0]);
				HttpResponse response = client.execute(get);
				if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
					HttpEntity entity = response.getEntity();
					InputStream is = entity.getContent();
					long total = entity.getContentLength();
					System.out.println(total);
					ByteArrayOutputStream baos = new ByteArrayOutputStream();
					byte[] buf = new byte[1024];
					int count = 0;
					int length = -1;
					while ((length = is.read(buf)) != -1) {
						baos.write(buf, 0, length);
						count+=length;
						// 调用publishProgress()方法公布进度,最后onProgressUpdata方法将被执行
						publishProgress((int) (count/length));
						//为了更明显的展现效果,每次暂停0.5s
						Thread.sleep(500);
					}
					return new String(baos.toByteArray(), "utf-8");
				}
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return null;
		}

		// onProgressUpdata方法,用于更新进度信息,例如执行进度条程序
		protected void onProgressUpdate(Integer... values) {
			progressBar.setProgress(values[0]);
			textView.setText("Loading......" + values[0]);
		}

		// onPostExecute方法,用于在执行完后台任务后,更新UI,显示结果
		protected void onPostExecute(String result) {
			textView.setText(result);
		}

		// onCacelled方法,用于在取消执行中的任务时,更改UI
		protected void onCancelled() {
			textView.setText("cancelled");
			progressBar.setProgress(0);
		}

	}
}




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