AsyncTask异步处理

AsyncTask是什么?

它是一个执行大开销操作的帮助类。如果你正在开发一个需要访问web服务端的手机应用,很可能你已经使用过它了。

其基本思路是:发起一个异步任务,当任务线程执行过程中,显示一个漂亮的进度框,当任务将结果返回到Activity时进度框关闭。
但是如果用户决定旋转屏幕,可异步任务还在运行怎么办(屏幕旋转当前的Activity会完成整个一轮生命周期。然后重新创建,回调onCreate()方法。)?
或是一个电话打进来,打断应用,Android决定将该应用进程杀死怎么办?这两种动作都会中断activity,当下次继续使用该应用时会recreate该Activity。
很不幸,AsyncTask仍旧在运行,并且保留一个指针指向老的Activity,因为重启的Activity在内存中式完全不同的一个对象(并且还会执行Activity的onCreate(),
就好像Activity是第一次启动一样)。我不确定AsyncTask是否还会将结果返回给老的Activity对象(如果是弱引用,可能它已经被回收),
但是无论如何,新的Activity不会接收到该数据,因为完全是一个新的Activity实例。

 
package com.example.asynctask;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
	private TextView message;
	private Button open;
	private EditText url;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		message = (TextView) findViewById(R.id.textView);
		open = (Button) findViewById(R.id.bt);
		url = (EditText) findViewById(R.id.editText);
		open.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				connect();
			}
		});
	}

	protected void connect() {
		PageTask task = new PageTask(this);
		task.execute(url.getText().toString().trim());
	}

	// 继承AsyncTask并实现其方法
	class PageTask extends AsyncTask<String, Integer, String> {
		ProgressDialog pdialog;

		@SuppressWarnings("deprecation")
		// 构造函数,在调用该构造函数时,将自动创建一个进度条对话框并显示
		public PageTask(Context context) {
			pdialog = new ProgressDialog(context, 0);
			// 给对话框加取消按钮
			/*
			 * pdialog.setButton("cancel", new DialogInterface.OnClickListener()
			 * { public void onClick(DialogInterface dialog, int which) {
			 * dialog.cancel(); } });
			 */
			pdialog.setButton(DialogInterface.BUTTON_POSITIVE, "cancel",
					new DialogInterface.OnClickListener() {

						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							dialog.cancel();
						}
					});
			// 为pdialog添加取消事件监听器
			pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
				public void onCancel(DialogInterface dialog) {
					dialog.dismiss();
					// 当要取消正在执行的任务时,可以调用asyncTask中的cancel方法
					// public final boolean cancel (boolean
					// mayInterruptIfRunning)
					// 当mayInterruptIfRunning为true的话,则中断正在执行的程序,如果为false则允许正在执行的线程执行完。
					// 执行该方法会触发onCancelled()方法
					PageTask.this.cancel(true);

				}
			});
			pdialog.setCancelable(true);// 对话框是否会被取消,如要要添加setOnCancelListener事件监听,这里必须为true
			pdialog.setMax(100);
			pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			pdialog.show();

		}

		// 后台线程执行完onPreExcute后立即调用,被用于执行较长时间的后台计算,在执行过程中可以调用publishProgress来更新任务的进度
		@Override
		protected String doInBackground(String... arg0) {
			System.out.println("doInBackground is running");
			try {
				int i = 0;
				while (i < 100) {
					// 当调用doInBackground在后台执行计算时调用该方法
					// 每当在UI线程调用此方法时将触发onProgressUpdate方法的执行参数
					i += 10;
					publishProgress(i);
					Thread.sleep(1000);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			return "下载完成";
		}

		@Override
		// 当调用cancel()方法时会触发该方法
		protected void onCancelled() {
			System.out.println("onCancelled is running");
			message.setText("下载失败");
			super.onCancelled();
		}

		@Override
		// 在doInBackground调用之后调用,此方法中的参数是doInBackground的返回值
		protected void onPostExecute(String result) {
			System.out.println("onPostExecute is running");
			pdialog.dismiss();
			message.setText(result);
		}

		@Override
		// 此方法在doInBackground调用之前调用
		protected void onPreExecute() {
			System.out.println("onPreExecute is running");
			System.out.println(url.getText());
			message.setText("开始下载");
		}

		@Override
		// 此方法在UI线程中publishProgress(Progress...)调用之后调用,该方法中的参数values是publishProgress(Progress...)中的参数
		//
		protected void onProgressUpdate(Integer... values) {
			System.out.println("onProgressUpdate is running");
			System.out.println("" + values[0]);
			message.setText("" + values[0]);
			pdialog.setProgress(values[0]);
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

猜你喜欢

转载自402606425-qq-com.iteye.com/blog/1633262