安卓耗时操作-异步任务之 AsyncTask

      安卓开发中,初学阶段对于耗时操作一般都用子线程来实现,但是这种方式很不规范  ,  第一:  子线程开的多了造成资源浪费;   第二  :由于子线程属于异步,主线程退出时该子线程可能还在执行,这就造成了内存泄漏,  

      所以, 子线程不能盲目的去使用,这时 我们可以通过 使用 AsyncTask 来执行异步任务, 这样在Activity退出时 可以取消正在进行的任务,避免了内存泄漏 ,而且 请求的过程可控 , 这使得更新UI变得异常便捷...

废话不多说,接下来开始我们今天的代码:

/**
 * 创建异步任务类
 */
class MyAsyncTask extends AsyncTask<String, Integer, Boolean> {

	private ProgressDialog dialog;
	private boolean isContinue = true;
	private int index = 100;

	/**
	 * 任务执行前的操作 可以在这里进行准备的操作 比如显示进度条
	 */
	@Override
	protected void onPreExecute() {
		super.onPreExecute();

		dialog = new ProgressDialog(context);
		dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		dialog.setMax(100);
		dialog.setMessage("拼命加载中...");
		dialog.show();
	}

	/**
	 * 此方法在子线程中调用,可以在此进行耗时操作
	 * 
	 * @param params
	 *            任务执行时 传入的参数 长度可变
	 * @return 任务执行完以后的返回值 也是第三个泛型类型
	 */
	@Override
	protected Boolean doInBackground(String... params) {

	  while (isContinue) {

		if (index > 0) {

			index -= 10;

			SystemClock.sleep(100);

			// 为onProgressUpdate() 传递进度
			publishProgress(100 - index);
		} else {

			SystemClock.sleep(800);

			return true;
			}
		}
		return false;
	}

	/**
	 * 任务执行进度更新时的回调方法 在次更新进度
	 * 
	 * @param values
	 *            第二个泛型类型 当前进度
	 */
   @Override
	protected void onProgressUpdate(Integer... values) {
		super.onProgressUpdate(values);
		dialog.setProgress(values[0]);
	}
	/**
	 * 异步任务任务执行完以后 在主线程中调用
	 * 
	 * @param aBoolean
	 *            doInBackground()方法的返回值
	 */
	@Override
	protected void onPostExecute(Boolean aBoolean) {
		super.onPostExecute(aBoolean);
		if (aBoolean) {
			Toast.makeText(context, "任务执行完成", Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(context, "任务执行出错", Toast.LENGTH_SHORT).show();
		}
		dialog.dismiss();
	}
}

  @Override
   protected void onDestroy() {
	// 界面退出时 取消正在执行的任务
	if (asyncTask != null) {
		asyncTask.cancel(true);
	}
	super.onDestroy();
}
/**
	 * 创建异步任务类
	 */
	class MyAsyncTask extends AsyncTask<String, Integer, Boolean> {

		private ProgressDialog dialog;
		private boolean isContinue = true;
		private int index = 100;

		/**
		 * 任务执行前的操作 可以在这里进行准备的操作 比如显示进度条
		 */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();

			dialog = new ProgressDialog(context);
			dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			dialog.setMax(100);
			dialog.setMessage("拼命加载中...");
			dialog.show();
		}

		/**
		 * 此方法在子线程中调用,可以在此进行耗时操作
		 * 
		 * @param params
		 *            任务执行时 传入的参数 长度可变
		 * @return 任务执行完以后的返回值 也是第三个泛型类型
		 */
		@Override
		protected Boolean doInBackground(String... params) {

			while (isContinue) {

				if (index > 0) {

					index -= 10;

					SystemClock.sleep(100);

					// 为onProgressUpdate() 传递进度
					publishProgress(100 - index);
				} else {

					SystemClock.sleep(800);

					return true;
				}
			}
			return false;
		}

		/**
		 * 任务执行进度更新时的回调方法 在次更新进度
		 * 
		 * @param values
		 *            第二个泛型类型 当前进度
		 */
		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);

			dialog.setProgress(values[0]);
		}

		/**
		 * 异步任务任务执行完以后 在主线程中调用
		 * 
		 * @param aBoolean
		 *            doInBackground()方法的返回值
		 */
		@Override
		protected void onPostExecute(Boolean aBoolean) {
			super.onPostExecute(aBoolean);

			if (aBoolean) {
				Toast.makeText(context, "任务执行完成", Toast.LENGTH_SHORT).show();
			} else {
				Toast.makeText(context, "任务执行出错", Toast.LENGTH_SHORT).show();
			}

			dialog.dismiss();
		}
	}

	@Override
	protected void onDestroy() {

		// 界面退出时 取消正在执行的任务
		if (asyncTask != null) {
			asyncTask.cancel(true);
		}
		super.onDestroy();
	}

 实例化异步任务 

asyncTask = new MyAsyncTask();
// 执行任务
asyncTask.execute();

总结,异步任务是安卓编程入门必学操作,有效的降低了内存泄漏的风险

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Foritee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值