现在的位置: 首页 > 综合 > 正文

Android_AsyncTask详解

2013年02月13日 ⁄ 综合 ⁄ 共 3889字 ⁄ 字号 评论关闭

1.概述

AsyncTask是android提供的轻量级的异步类,实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
AsyncTask,用起来简单,过程也可控制,但是多个异步类对同一个UI进行操作时,过程变得复杂(不像Handler使用队列,不会出现多个同时执行)。

2.使用AsyncTask

(1).继承AsyncTask,覆写相应的方法

1).继承AsyncTask

/*
AsyncTask定义了三种泛型类型 Params,Progress和Result
Params 启动任务执行时接收的输入参数,比如要访问网络需要链接,设定为为 String
Progress 看台任务执行的进度,比如需要更新一个进度条,设定为Integer
Result 后台执行任务执行的结果,比如通过后台想得到一张图片,设定为BitMap
*/
class MyAsynTask extends AsyncTask<String, Integer, Bitmap>

2).覆写相应的方法

//Step 1
//在doInBackground()执行之前调用该方法,主要完成初始化工作。
protected void onPreExecute() {}

//Step 2
/*	在onPreExecute方法执行完毕后,执行该方法。
 * 比较耗时的操作都可以放在这里,注意这里不能直接操作UI。
 * 在执行过程中可以调用publicProgress(Progress…),就会执行异步类中的onProgressUpdate方法,用来更新任务的进度
 */
protected Bitmap doInBackground(String... params) {}

	//Step 2.1
	//主要来更新任务进度,只有doInBackground()中调用了publicProgress(Progress…)方法时,才会执行该方法
	protected void onProgressUpdate(Integer... values) {}

//Step 3
	//当于Handler处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
	protected void onPostExecute(Bitmap result) {}

	//或者执行当用户取消操作后,后调用该方法
	protected void onCancelled() {
		super.onCancelled();
	}

(2).实例化子类对象,并调用execute(params)方法

new MyAsynTask().execute(path);

3.应用(完成网络图片传输)

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private Button confirm;
	private EditText pathText;
	private ImageView imageView;
	private ProgressDialog dialog;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		confirm = (Button) this.findViewById(R.id.confirm);
		pathText = (EditText) this.findViewById(R.id.path);
		imageView = (ImageView) this.findViewById(R.id.image);
		final String path = pathText.getText().toString();
		confirm.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				new MyAsynTask().execute(path);
			}
		});
	}
	class MyAsynTask extends AsyncTask<String, Integer, Bitmap>{
		Bitmap bitmap = null;
		
		/*
		 * 在doInBackground()执行之前调用该方法,主要完成初始化工作。
		 */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			dialog = new ProgressDialog(MainActivity.this);
			dialog.setTitle("请稍后");
			dialog.setMessage("正在下载 ...");
			dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			dialog.setCancelable(false);
			dialog.show();
		}
		/*
		 * 在onPreExecute方法执行完毕后,执行该方法。
		 * 比较耗时的操作都可以放在这里,注意这里不能直接操作UI。
		 * 在执行过程中可以调用publicProgress(Progress…),就会执行异步类中的onProgressUpdate方法,用来更新任务的进度
		 */
		@Override
		protected Bitmap doInBackground(String... params) {
			String path = params[0];
			try {
				HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
				conn.setConnectTimeout(3000);
				conn.setRequestMethod("GET");
				
				if(conn.getResponseCode() == 200){
					InputStream in = conn.getInputStream();
					ByteArrayOutputStream bos = new ByteArrayOutputStream();
					long totalSize = conn.getContentLength();
					long currentSize = 0;
					byte[] bytes = new byte[1024];
					int  len = -1;
					while((len=in.read(bytes)) != -1){
						currentSize += len;
						publishProgress((int) ((currentSize/(float)totalSize)*100));
						bos.write(bytes, 0, len);
					}
					bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.size());
					return bitmap;
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			return null;
		}
		
		/*
		 * 主要来更新任务进度
		 * 只有doInBackground()中调用了publicProgress(Progress…)方法时,才会执行该方法
		 */
		@Override
		protected void onProgressUpdate(Integer... values) {
			// TODO Auto-generated method stub
			super.onProgressUpdate(values);
			dialog.setProgress(values[0]);
		}
		/*
		 * 当于Handler处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
		 */
		@Override
		protected void onPostExecute(Bitmap result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			imageView.setImageBitmap(bitmap);
			dialog.dismiss();
		}
		/*
		 * 当用户取消操作后,后调用该方法
		 */
		@Override
		protected void onCancelled() {
			// TODO Auto-generated method stub
			super.onCancelled();
		}
	}
}

抱歉!评论已关闭.