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相关推荐

  1. 异步任务-AsyncTask

    异步任务-AsyncTask 为什么要异步任务 android单线程模型 耗时操作放在非主线程中执行 AsyncTask为何而生 子线程更新UI 封装,简化异步操作 异步任务AsyncTask 构件A ...

  2. 【Android 异步操作】AsyncTask 异步任务 ( AsyncTask 异步任务执行方法 execute 方法相关源码解析 )

    文章目录 一.AsyncTask 异步任务执行方法 execute() 引入 二.AsyncTask 异步任务执行方法 execute() 三.sDefaultExecutor 线程池解析 四.exe ...

  3. android服务绑定异步,Android中异步类AsyncTask用法总结

    本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...

  4. android异步编程,AsyncTask简单的异步编程android 中的实现

    类型:行业软件大小:1.5M语言:中文 评分:5.0 标签: 立即下载 在开发移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用 ...

  5. Android开发笔记(四十九)异步任务处理AsyncTask

    AsyncTask异步任务 Thread+Handler方式虽然能够实现多线程的通信处理,但是写起代码来颇为繁琐,所以Android提供了AsyncTask这样一个轻量级的异步任务类,其内部封装好Th ...

  6. Android 异步处理AsyncTask

    2019独角兽企业重金招聘Python工程师标准>>> AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是andro ...

  7. 深入理解安卓异步任务AsyncTask

    上一节讲了asynctask的官方文档,这一节深入讲解如何深入使用AsyncTask. asynctask本质上也是线程启动,只是它封装了一些内容,可以运行在后台,同时可以和UI线程交互. async ...

  8. android asyc异步获取网络图片为bitmap,异步之AsyncTask(一)

    插图.png 导读 在Android中每一个应用都拥有自己的独立进程,而一个进程可以拥有多个线程,在这些线程中有一个线程叫做MainThread(也叫UIThread).它负责显示.更新UI,与用户交 ...

  9. Android中异步任务AsyncTask的使用

    1.当程序启动的时候,Android同时会启动一个对应的线程,[主线程.UI线程]主要负责处理与UI相关的线程 2.UI线程不允许访问网络进行耗时操作 3.子线程不允许更新UI. 由于Android中 ...

最新文章

  1. WP8:Unity3D之间的值传递
  2. NLP汉语自然语言处理原理与实践
  3. 无法将stdClass类型的对象用作数组?
  4. 深度学习的三种硬件方案:ASIC,FPGA,GPU;你更看好?
  5. 几个SpringCloud常见面试题及答案
  6. 使用Docker-Compose搭建高可用redis哨兵集群
  7. idea报“Usage of API documented as @since 1.7”这一问题的解决方法
  8. 技本功丨用短平快的方式告诉你:Flink-SQL的扩展实现
  9. Does Rails Hurt?
  10. SpringBoot 的事务管理
  11. 如何用一句话证明你搞 IT(挨踢)的?
  12. clamp.js 的使用---超出省略 (翻译)
  13. 提高linux运行速度,教你如何提高Linux操作系统的运行速度
  14. SG90舵机驱动程序
  15. 数字图像处理——最大类间方差法(OTSU)图像阈值分割实例
  16. 基于ISIS路由协议的路由聚合
  17. python爬取饿了么评论_爬虫实例:饿了么爬虫
  18. 30岁人生进度条_人生的进度条
  19. 公众号点击图片变成另一张_朋友圈也能发九宫格图片,再也不犯选择困难症
  20. 英语3500词(四)workplace主题 (2022.1.16)

热门文章

  1. python按钮点击按一次触发一次_家里有个“按钮开关”能救命,必须每个月按一次,学会受用一生!...
  2. 第十八篇:java操作Excel要处理和分辨的几个概念
  3. 95% CI, 置信区间 Confidence Interval
  4. VS2015 无法启动 IIS服务器
  5. 1023. 组个最小数
  6. Logistic Regression逻辑回归
  7. [数据库基础]——索引详解
  8. 学习是一个漫长不能松懈的过程
  9. [置顶] 软件设计之道_读书纪要.doc
  10. oracle limsize,查看oracle数据库----size