异步任务AsyncTask
Android是单线程模型,耗时操作应放在非主线程中执行,故需要异步任务
AsyncTask可以使子线程中更新UI,封装、简化异步操作
构建AsyncTask子类的参数
AsyncTask<Params, Progress, Result>是一个抽象类,通常用于被继承,继承AsyncTask需要制定三个泛型参数:
Params:启动任务时输入参数的类型
Progress:后台任务执行中返回进度值的类型
Result:后台执行任务完成后返回结果的类型
构建AsyncTask子类的回调方法:
doInBackground:必须重写,异步执行后台线程将要完成的任务,其他的 方法并不是必须的
onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作
onPostExecute:当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法
onProgressUpdate:在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法,获取进度,更新进度条
其中调用顺序是: onProExecute()-->doInBackground()-->onPostExecute()
若在doInBackground()中调用publishProgress()方法时,调用顺序是:onProExecute()-->doInBackground()-->onProgressUpdate()-->onPostExecute()
加载网络图片的实例:
异步处理-->下载图像
UI线程-->设置图像
public class ImageTest extends Activity{private ImageView mImageView;private ProgressBar mProgressBar;private static String URI = "http://pic4.nipic.com/20091121/3764872_215617048242_2.jpg";protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.image);mImageView = (ImageView)findViewById(R.id.image);mProgressBar = (ProgressBar)findViewById(R.id.progressbar);new MyAsyncTask().execute(URL); //设置传递进的参数}class MyAsyncTask extends AsyncTask<String, void, Bitmap>{//<url类型, 进度值类型,返回值类型>protected void onPreExecute(){super.onPreExecute();mProgressBar.setVisibility(View.VISIBLE); //显示进度条}protected Bitmap onPostExecute(Bitmap bitmap){super.onPostExecute(bitma);//操作UI,设置图像mProgressBar.setVisibility(View.GONE);mImageView.setImageBitmap(bitmap);}protected Bitmap doInBackground(String... params){String url = params[0]; //取出对应的URLBitmap bitmap = null;URLConnection connection;InputStream is;try{connection = new URL(url).openConnection();is = connection.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);Thread.sleep(3000); //为了使加载的效果更明显,人为限制一下//通过decodeStream解析输入流bitmap = BitmapFactory.decodeStream(bis);is.close(); //注意关闭输入输出流bis.close();}catch(IOException e){e.printStackTrace();}catch(InterruptedException e){e.printStackTrace();}//将bitmap返回return bitmap;}}
}
模拟进度条的实现:
public class ProgressBarTest extends Activity{private ProgressBar mProgressBar;private MyAsyncTask mTask;protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.progressbar);mProgressBar = (ProgressBar)findViewById(R.id.pg);mTask = new MyAsyncTask();mTask.execute();}class MyAsyncTask extends AsyncTask<Void, Integer, Void>{protected Void doInBackground(Void... params){//模拟进度更新for(int i = 0; i<100;i++){publishProgress(i);try{Thread.sleep(300);}catch(InterruptedException){e.printStackTrace();}}return null;}protected void onProgressUpdate(Integer... values){super.onProgressUpdate(values);//获取进度更新值mProgressBar.setProgress(values[0]);}}
}
//然后将此ProgressBarTest类部署至mainActivity中
但是这个会出现重复进入线程时,出现”bug“,只有将前面的AsyncTask完成后才能执行当前的任务,只需将AsyncTask生命周期与Activity生命周期一致即可,
只需要在onPause()方法中加入判断:
protected void onPause(){super.onPause();if(mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING){mTask.cancel(true); //cancel()方法只是将对应的AsyncTask标记为cancel状态,并不是真的取消//故需要在doInBackground()和onProgressUpdate()方法中加入判断语句}
}
protected Void doInBackground(Void... params){//模拟进度更新for(int i = 0; i<100;i++){if(isCancelled()){break;}publishProgress(i);try{Thread.sleep(300);}catch(InterruptedException){e.printStackTrace();}}return null;}protected void onProgressUpdate(Integer... values){
super.onProgressUpdate(values); if(isCancelled()){
return;}//获取进度更新值mProgressBar.setProgress(values[0]);}
使用AsyncTask注意事项:
必须在UI线程中创建AsyncTask的实例
必须在UI线程中调用AsyncTask的execute()方法
重写的四个方法是系统自动调用的,不应手动调用
每个AsyncTask只能被执行一次,多次调用将会引发异常
只有doInBackground()方法是运行在其他线程,其他方法都是运行在主线程,即其他方法都可以更新UI,而只有这个方法需要做异步处理
异步任务AsyncTask相关推荐
- 异步任务-AsyncTask
异步任务-AsyncTask 为什么要异步任务 android单线程模型 耗时操作放在非主线程中执行 AsyncTask为何而生 子线程更新UI 封装,简化异步操作 异步任务AsyncTask 构件A ...
- 【Android 异步操作】AsyncTask 异步任务 ( AsyncTask 异步任务执行方法 execute 方法相关源码解析 )
文章目录 一.AsyncTask 异步任务执行方法 execute() 引入 二.AsyncTask 异步任务执行方法 execute() 三.sDefaultExecutor 线程池解析 四.exe ...
- android服务绑定异步,Android中异步类AsyncTask用法总结
本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...
- android异步编程,AsyncTask简单的异步编程android 中的实现
类型:行业软件大小:1.5M语言:中文 评分:5.0 标签: 立即下载 在开发移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用 ...
- Android开发笔记(四十九)异步任务处理AsyncTask
AsyncTask异步任务 Thread+Handler方式虽然能够实现多线程的通信处理,但是写起代码来颇为繁琐,所以Android提供了AsyncTask这样一个轻量级的异步任务类,其内部封装好Th ...
- Android 异步处理AsyncTask
2019独角兽企业重金招聘Python工程师标准>>> AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是andro ...
- 深入理解安卓异步任务AsyncTask
上一节讲了asynctask的官方文档,这一节深入讲解如何深入使用AsyncTask. asynctask本质上也是线程启动,只是它封装了一些内容,可以运行在后台,同时可以和UI线程交互. async ...
- android asyc异步获取网络图片为bitmap,异步之AsyncTask(一)
插图.png 导读 在Android中每一个应用都拥有自己的独立进程,而一个进程可以拥有多个线程,在这些线程中有一个线程叫做MainThread(也叫UIThread).它负责显示.更新UI,与用户交 ...
- Android中异步任务AsyncTask的使用
1.当程序启动的时候,Android同时会启动一个对应的线程,[主线程.UI线程]主要负责处理与UI相关的线程 2.UI线程不允许访问网络进行耗时操作 3.子线程不允许更新UI. 由于Android中 ...
最新文章
- WP8:Unity3D之间的值传递
- NLP汉语自然语言处理原理与实践
- 无法将stdClass类型的对象用作数组?
- 深度学习的三种硬件方案:ASIC,FPGA,GPU;你更看好?
- 几个SpringCloud常见面试题及答案
- 使用Docker-Compose搭建高可用redis哨兵集群
- idea报“Usage of API documented as @since 1.7”这一问题的解决方法
- 技本功丨用短平快的方式告诉你:Flink-SQL的扩展实现
- Does Rails Hurt?
- SpringBoot 的事务管理
- 如何用一句话证明你搞 IT(挨踢)的?
- clamp.js 的使用---超出省略 (翻译)
- 提高linux运行速度,教你如何提高Linux操作系统的运行速度
- SG90舵机驱动程序
- 数字图像处理——最大类间方差法(OTSU)图像阈值分割实例
- 基于ISIS路由协议的路由聚合
- python爬取饿了么评论_爬虫实例:饿了么爬虫
- 30岁人生进度条_人生的进度条
- 公众号点击图片变成另一张_朋友圈也能发九宫格图片,再也不犯选择困难症
- 英语3500词(四)workplace主题 (2022.1.16)
热门文章
- python按钮点击按一次触发一次_家里有个“按钮开关”能救命,必须每个月按一次,学会受用一生!...
- 第十八篇:java操作Excel要处理和分辨的几个概念
- 95% CI, 置信区间 Confidence Interval
- VS2015 无法启动 IIS服务器
- 1023. 组个最小数
- Logistic Regression逻辑回归
- [数据库基础]——索引详解
- 学习是一个漫长不能松懈的过程
- [置顶] 软件设计之道_读书纪要.doc
- oracle limsize,查看oracle数据库----size