Android_AsyncTask

掌握Android开发中的AsyncTask异步处理 本文还有配套的精品资源,点击获取 简介:在Android开发中, AsyncTask 是处理后台任务并在UI线程中更新结果的一种简便方式,以避免UI阻塞。本文将介绍如何在Android活动中使用 AsyncTask 来执行异步任务,包括其三个泛型参数的定义、主要方法的使用,以及一个简单的实践示例。尽管 AsyncTask 有其限制,... 阅读详情

一.AsyncTask的简介
       在Android中实现异步任务机制有两种方式,Handler和AsyncTask。
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。为了简化操作Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
       AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程.
       我通常会把代码的逻辑想成现实生活中的某些现象,加以理解!以前的博客的都没有把这类想法写在博客,是怕误导别人!以后的博客我会加上这部分,仅仅是为了自己的回忆和理解!
       AsyncTask,为什么需要这个东西呢?
       因为每个程序就只有一个主线程,就像我们公司中某个项目的项目管理者,负责展示项目(显示UI)等操作,可是他不可能一个人做完一整个项目,需要其他人的帮忙做其他的事情,这也就好比是线程了!让线程去做一些耗时的操作,然后做完就告诉项目负责人,做完了,可以更新我们的项目了(更新UI)!那帮忙做事的人也不可能就一个人,一个人的效率太低了,可能已一队人,也就是线程池了!AsyncTask也就是把这一麻烦的过程给封装好了,可以理解为AsyncTask是这个过程规范!
二.AsyncTask的方法
       构建AsyncTask子类的泛型参数
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承.继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务时输入的参数类型.
Progress:后台任务执行中返回进度值的类型.
Result:后台任务执行完成后返回结果的类型.
       构建AsyncTask子类的回调方法
AsyncTask主要有如下几个方法:
doInBackground:必须重写,异步执行后台线程要完成的任务,耗时操作将在此方法中完成.
onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作.
onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.
        onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进度.
三.示例
       演示一个典型的异步处理的实例--加载网络图片.网络操作作为一个不稳定的耗时操作,从4.0开始就被严禁放入主线程中.所以在显示一张网络图片时,我们需要在异步处理中下载图片,并在UI线程中设置图片。
       代码中主要是onPreExecute,doInBackground,onPostExecute方法中进行操作,我们可以理解为:项目的负责人发布了一项任务,需要完成,因此他用AsyncTask这个规范去执行(execute()),任何的任务都基本是三个部分,事前准备(onPreExecute),执行工作(doInBackground),完成结果(onPostExecute)!
       好了,看下界面效果和代码,自己联想下!
       还有一点,这里用到网络操作,记得加权限喔!
<uses-permission android:name="android.permission.INTERNET"/>




package com.liangdianshui.asynctaskdemo;

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

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class DownloadImageActivity extends Activity {

	private ProgressBar mProgress;
	private ImageView mIvDownloadImage;
	private static String Url ="http://img5.imgtn.bdimg.com/it/u=794383953,3828916890&fm=21&gp=0.jpg";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_download_image);
		initView();
		new MyAsyncTask().execute(Url);
	}

	private void initView() {
		mProgress = (ProgressBar) findViewById(R.id.progress);
		mIvDownloadImage = (ImageView) findViewById(R.id.iv_image_download);
	}

	/**
	 * Params:启动任务时输入的参数类型. doInBackground()
	 * Progress:后台任务执行中返回进度值的类型.onProgressUpdate()
	 * Result:后台任务执行完成后返回结果的类型.onPostExecute()
	 */
	class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {

		//进行异步任务的处理.
		@Override
		protected Bitmap doInBackground(String... params) {
			//获取传进来的第一个参数
			String url = params[0];
			Bitmap bitmap = null;
			try {
				/**
				 * No address associated with hostname
				 * 报上面的错误原因:1.没有设置连网的权限  2.手机没开网络
				 */
				//打开链接
				URLConnection urlConnection = new URL(url).openConnection();
				InputStream inputStream = urlConnection.getInputStream();
				BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
				//为了更清楚的显示,在线程休眠3s
				Thread.sleep(3000);
				bitmap = BitmapFactory.decodeStream(bufferedInputStream);
				//记得关闭流
				bufferedInputStream.close();
				inputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return bitmap;
		}

		//异步处理前的操作
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			//将ProgressBar设置为可见的
			mProgress.setVisibility(View.VISIBLE);
		}

		//异步处理后的操作
		//bitmap是doInBackground操作后返回的值
		@Override
		protected void onPostExecute(Bitmap bitmap) {
			super.onPostExecute(bitmap);
			//操作完成后把进程显示隐藏,并把异步下载的图片显示在ImageView中
			mProgress.setVisibility(View.GONE);
			mIvDownloadImage.setImageBitmap(bitmap);
		}
	}
}

第二个示例是“加载进条”
我们看下示例的效果吧:


           这里看起来好像没啥问题啊,可是仔细看,你会发现,当加载进度条加载到一半的时候,你按返回键,再加载进度条,你会发现,要等待一段时间才会加载!这是为什么呢?
       因为:AsyncTask是基于线程池进行实现的,当一个线程没有结束时,后面的线程是不能执行的.所以必须等到第一个task的for循环结束后,才能执行第二个task.我们知道,当点击BACK键时会调用Activity的onPause()方法.为了解决这个问题,我们需要在Activity的onPause()方法中将正在执行的task标记为cancel状态,在doInBackground方法中进行异步处理时判断是否是cancel状态来决定是否取消之前的task.
        这就好像是项目的负责人,发布了一项任务,那一队人就在干这项任务(线程池执行操作,也就是doInBackground方法的操作),好了今天做到一半,明天上班上班,会继续干这个任务,而不会停下来,重新执行这个任务或者干另一个任务!因为他没有接收到负责人的命令!因此当按了返回键的时候,我们再点击加载进度条,项目的负责人需要告诉他们这个项目暂时不做了(也就是把执行的task标记为cancel状态),然后工人就判断这个任务是否有这个状态,有这个状态就停止不干了!
        加上了cancel后的效果图是这样的:



代码:

package com.liangdianshui.asynctaskdemo;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ProgressBar;

public class ProgressActivity extends Activity {

	private ProgressBar mProgress;
	private MyAsyncTask mAsyncTask;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_progress);
		mProgress = (ProgressBar) findViewById(R.id.pro_show_progress);
		mAsyncTask=new MyAsyncTask();
		mAsyncTask.execute();
	}

	class MyAsyncTask extends AsyncTask<Void, Integer, Void> {
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			mProgress.setProgress(0);
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
			mProgress.setProgress(values[0]);
		}

		@Override
		protected void onPostExecute(Void aVoid) {
			super.onPostExecute(aVoid);
		}

		@Override
		protected Void doInBackground(Void... params) {
			for (int i = 0; i < 100; i++) {
				//如果task是cancel状态,则终止for循环
				if (isCancelled()) {
					break;
				}
				//调用publishProgress方法将自动触发onProgressUpdate方法,把参数传进去,来进行进度条的更新.
				publishProgress(i);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			return null;
		}
	}

	;

	@Override
	protected void onPause() {
		super.onPause();
		if (mAsyncTask != null && mAsyncTask.getStatus() == AsyncTask.Status.RUNNING) {
			//cancel方法只是将对应的AsyncTask标记为cancelt状态,并不是真正的取消线程的执行.
			mAsyncTask.cancel(true);
		}
	}
}

好了,胡说八道完了!

示例的Demo:http://download.youkuaiyun.com/detail/two_water/9510336



Android最全最简单的异步任务AsyncTask使用解析 Android最全最简单的异步任务AsyncTask使用解析.一步到位彻底理解异步任务。 立即下载

相关推荐

oracle rac 成本及架构,Oracle Extended RAC 架构实战

Extended-RAC,是RAC技术的一种扩展增强。Extended-RAC是通过专用光纤(或租用裸光纤)加DWDM(波分设备)设备将两个不同楼栋/同城甚至异地机房进行相连,将数据库主机、存储分别放置于不同机房,利用存储复制/ASM Mirror等技术进行数据复制进行搭建的一种远距离集群架构。Extended RAC需要将不同楼栋/同城甚至异地机房通过专用光纤(或租用裸光纤)加DWDM(光纤复用...

weixin_33812391的博客 2453

Android AsyncTask 详解

将复杂工作异步化、线程化对于Android 的性能的提高起到了很重要的作用,Android 框架为开发提供了很多辅助程序,这一篇着重分析Android AsyncTask的原理。

私房菜 6810

微信4.1.5.16升级后,你的自动化脚本失灵了?手把手教你用C#让UI树“复活”

微信4.1.5.16版本更新导致自动化脚本失效?本文深入解析微信UI树隐藏的原因,并提供C#实战解决方案,通过UIAutomation技术恢复UI树结构,帮助开发者重新实现自动化操作。涵盖技术原理、代码实现及优化策略,适合RPA开发者和自动化脚本编写者参考。

weixin_30879169的博客 519

Android AsyncTask(线程间通信)

1.AsyncTask 在Android中我们可以通过Thread+Handler实现多线程通信,一种经典的使用场景是:在新线程中进行耗时操作,当任务完成后通过Handler向主线程发送Message,这样主线程的Handler在收到该Message之后就可以进行更新UI的操作。上述场景中需要分别在Thread和Handler中编写代码逻辑,为了使得代码更加统一,我们可以使用AsyncTask类。 AsyncTask是Android提供的一个助手类,它对Thread和Handler进行了封装,方便我们使用。

zenmela2011的专栏 6742

西安交通大学软件学院——分布式系统练习题(综合题)

摘要:本文探讨了分布式系统的核心特性与关键问题。首先阐述了分布式系统的8种透明性特性,包括访问、定位、迁移等。然后通过具体案例分析了分布式事务的回滚机制、域名解析的迭代与递归过程、不同分布式系统的异同比较。重点讨论了RPC通信中客户端/服务器崩溃的处理方法,包括消灭、再生和到期三种策略。最后介绍了Lamport时间戳算法在进程通信中的应用及问题解决方案。全文涵盖了分布式系统设计中的透明性、可靠性、一致性等核心问题。

qq_73044452的博客 204

虚幻商城 Quixel 免费资产一键入库

在免费领取所有Megascans之后,我们只是有了获取 Quixel Megascans 资产的资格,但是没有入 Fab 库,本文将讲解通过脚本将 Quixel 所有资产入库 Fab。

一碗清深的博客 3308

Android 异步任务类之AsyncTask 完全解析

Android 异步任务类之AsyncTask 完全解析

weixin_42504805的博客 2366

LPDDR6与LPDDR5 ZQ Calibration技术探讨

LPDDR6与LPDDR5 ZQ Calibration技术探讨

zilan23的博客 1099

40. 【Android教程】AsyncTask:异步任务

AsyncTask 类通常用来在执行后台任务的同时刷新 UI,通过调用execute()方法触发后台任务的执行,首先会回调 AsyncTask 的,接着回调来执行自定义的后台任务,最后回调。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 2213

Allegro如何进行四层板板层设计

板层的设计

weixin_42499230的博客 3189

SAP 经营范围(Operating Concern) 和业务范围 (Business Area) 在核算架构或是管理架构中的区别和联系分别是什么 请给具体的示例

摘要:SAP系统中,业务范围(Business Area)和经营范围(Operating Concern)在核算架构中具有不同功能。业务范围是FI/CO共用维度,用于跨公司码的业务线核算(如电子产品、机械设备),支持内部管理和简单对外报表。经营范围则是CO-PA专属维度,聚焦获利能力分析,可细化到产品+客户+区域组合(如分析手机在华东区域的获利情况)。两者存在层级关联:经营范围包含业务范围作为基础维度,业务范围数据会传递至经营范围进行深度分析。实际应用中需先配置业务范围,再设置经营范围并关联相关维度,共同支

金牌架构师 95

安卓 Android后台线程 AsyncTask

1. 异步任务类AsyncTask是一个包含三个参数的泛型AsyncTask<Params,Progress,Result>,其执行异步任务方法excute(Params…)的参数为类的第一参数类型的可变参数。 2. 定义类AsyncTask的实例时,需要重写其抽象方法doInBackground()和另一个受保护的方法onPostExecute()。 3. 与Handler相比,AsyncTask增加了进度处理。 实现AsyncTask机制很简单,就是后台创建一个线程,在主线程中运行这个

y__De的博客 757

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android AsyncTask 深度解析

params)返回的结果,参数类型由AsyncTask类上的第三个泛型限定;onPreExecute()和onPostExecute()方法都执行在主线程,onProgressUpdate()能够更改UI(更改进度条进度)必然也是主线程。这个小demo通过求1-10的和,在doInBackground()方法中通过延时的方式模拟了耗时操作,简单的演示了AsyncTask的使用。doInBackground()方法执行在线程池某一线程中,(看过源码后得到的结果,通过Log可以知道该方法没有执行在主线程中)

2501_90389522的博客 1582

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

安卓AsyncTask

参考:https://www.jianshu.com/p/ee1342fcf5e7 AsyncTask挺好用,能解决一大堆问题。 下面是总结的使用步骤: 1自定义类继承AsyncTask,里面分别传入三个参数,传入的参数、进度类型、返回的结果类型 2重写继承的相关方法,在相关方法中执行耗时操作和更新ui处理结果的操作 下面是转载的: 前言 多线程的应用在...

博客 572

【安卓学习积累】AsyncTask的源码分析

在记录本文之前有参考下面大神的文章,本文也加入了一些自己的见解。旨在记录和学习一些Android知识。欢迎大家一起来讨论。 别再傻傻得认为AsyncTask只可以在主线程中创建实例和调用execute方法 一、抛出几个问题 1.AsyncTask是否只能在主线程中创建并执行呢? 2.AsyncTask中的onPreExecute()、doInBackground(String... par...

xiangzaixiansheng的博客 219

详解Android中AsyncTask的使用

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。

LiuHe 39万+

Getting NoClassDefFoundError: android.os.AsyncTask

This problem has been bothering me for a bit and I cannot find a satisfactory solution. Many times (not always) in the creation of a specific object on the Android emulator I get NoClassDefFoundErr

攻城狮Luke 1895

安卓—— 详解Android中AsyncTask的使用

原文链接:http://blog.youkuaiyun.com/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例

Abby同学思考的地方 383

android AsyncTask介绍

AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l 简单,快捷 l 过程可控 使用的缺点: ...

u012123938的专栏 409

android之AsyncTask

android之AsyncTask

qq_44910624的博客 291

安卓的异步任务AsyncTask

第二个泛型用来限制onProgressUpdate(Progress)和publishProgress(Progress)方法传入参数的类型,在publishProgress方法中传入的参数会在onProgressUpdate回调方法中被使用。第一个泛型用来限制execute(Params)和doInBackground(Params)方法传入参数的类型,在execute方法中传入的参数会在doInBackground回调方法中被使用。广泛地讲异步任务就是以多线程的方式完成的功能需求,相对于同步。

weixin_71792169的博客 736

android.os.AsyncTask注意问题

android.os.AsyncTask在使用的时候,有几点需要格外注意: 1.异步任务的实例必须在UI线程中创建。 2.execute(Params... params)方法必须在UI线程中调用。 3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values

liu_jia_guo的专栏 810

安卓-AsyncTask的用法

原帖【悟道】: 跳转       在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只在UI线程中访问Android UI工具包       当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thre

ruiruiddd的博客 920

Android AsyncTask源码解析

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。由于篇幅有限,这里以图片的形式给大家展示一小部分。

2401_86353930的博客 2229

Android API之android.os.AsyncTask

android.os.AsyncTask&lt;Params, Progress, Result&gt; AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thre...

weixin_34203832的博客 187
上一篇: JavaWeb(一)_JavaWeb开发入门
下一篇: JAVA_零碎知识点
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值