asynctask异步任务机制

本文深入探讨了AsyncTask类在Android开发中的应用,特别关注其多任务执行模式,通过实例展示了如何利用AsyncTask高效地执行并行任务,并在执行过程中更新UI,确保用户体验流畅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用AsyncTask类可以管理后台操作,这些后台操作最终会将结果返回UI线程

其相应的回调方法:onPreExecute()---   后台处理开始之前在UI线程中运行

doInBackground()---- 实际后台运行在此完成

publicProgress()----  此方法由doInBackground()调用  利用此可以将值返回给onProgressUpdata()

onProgressUpdata() --- 调用publicProgress()时执行此方法

onPostExecute()   ---- 后台处理结束后执行此方法

其执行周期为由上到下执行

以进度条为例,其基本执行方式如下单任务执行时默认排队执行(内部实现为Thread+ Handler)

public class MyAsynctask extends AsyncTask<Void, Integer, String>{   //实现方式,继承AsyncTask类   第一个参数,获取网络资源时设置,没有则为Void
<span style="white-space:pre">									</span>//第二个参数,调用<span style="font-family: Arial, Helvetica, sans-serif;">onProgressUpdate时使用,若不使用则为Void</span>
<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space:pre">																		</span>//第三个参数,执行</span><span style="font-family: Arial, Helvetica, sans-serif;">onPostExecute参数,得到想要返回值类型,若不使用则为Void</span><span style="font-family:Arial, Helvetica, sans-serif;">

</span>

		@Override
		protected String doInBackground(Void... params) {    //省略号为可变数组
			
			
					for(int i = 1; i<=100;i++){
						
						publishProgress(i);   //将参数传递给onProgressUpdate中
						try {
							Thread.sleep(50);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					
					String progressSuccess = "加载完成";
			return progressSuccess;      //返回值返回到<span style="font-family: Arial, Helvetica, sans-serif;">onPostExecute中</span>

		}
		
		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
			
			int progress = values[0];
			mPregressBar.setProgress(progress);
			mProgressTxt.setText(""+progress);
			
		}
		
		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			mProgressTxt.setText(result);
		}
		
	}

上方执行时为单任务执行,下面看一下多任务执行模式

Executor  exec = new ThreadPoolExecutor(10, 100, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());//设置线程池活动线程数量和最大线程数

下方采用匿名内部类形式  image 为一网络地址数组   (下方会出现图片错乱情况

<span style="white-space:pre">		</span>new AsyncTask<String, Void, Bitmap>(){

				@Override
				protected Bitmap doInBackground(String... params) {
					// TODO Auto-generated method stub
					return downLoadImage(image[position]);
				}
				@Override
				protected void onPostExecute(Bitmap result) {
					super.onPostExecute(result);
					gridview.setImageBitmap(result);     //<span style="font-family: Arial, Helvetica, sans-serif;">gridview 为ImageView  在适配器中设置资源,防止重复加载 (此段代码在自定义适配器的getView方法中执行)</span>

				}
				
//			}.execute(image);    //单任务执行
		}.executeOnExecutor(exec, image) ;  //多任务执行

/*
	 * 访问网络时需要在manifest加上网络权限   ,从网络获取图片资源
	 * */
	public Bitmap downLoadImage(String httpUrl){
		try {
			URL url = new URL(httpUrl);
			
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			
			InputStream is = connection.getInputStream();
			
			Bitmap bitmap = BitmapFactory.decodeStream(is);
			return bitmap;
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值