3.7 AsyncTask异步任务

分类 Android 基础入门教程

本节引言:

本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧!


1.相关概念

1)什么是多线程:

答:先要了解这几个名称:应用程序,进程,线程,多线程!!

  • 应用程序(Application):为了完成特定任务,用某种语言编写的一组指令集合(一组静态代码)
  • 进程(Process) :运行中的程序,系统调度与资源分配的一个独立单位,操作系统会为每个进程分配 一段内存空间,程序的依次动态执行,经理代码加载 -> 执行 -> 执行完毕的完整过程!
  • 线程(Thread):比进程更小的执行单元,每个进程可能有多条线程,线程需要放在一个进程中才能执行! 线程是由程序负责管理的!!!而进程则是由系统进行调度的!!!
  • 多线程概念(Multithreading):并行地执行多条指令,将CPU的时间片按照调度算法,分配给各个线程,实际上是分时执行的,只是这个切换的时间很短,用户感觉是同时而已!

举个简单的例子: 你挂着QQ,突然想去听歌,你需要把QQ关掉,然后再去启动XX播放器吗?答案是否定的,我们直接打开播放器 放歌就好,QQ还在运行着,是吧!这就是简单的多线程~在实际开发中,也有这样的例子,比如应用正在运行, 发现新版本了,想后台更新,这个时候一般我们会开辟出一条后台线程,用于下载新版本的apk,但是这个时候 我们还可以使用应用中的其他功能!这就是多线程的使用例子~

2)同步与异步的概念:

答: 同步:当我们执行某个功能时,在没有得到结果之前,这个调用就不能返回!简单点就是说必须 等前一件事做完才能做下一件事;举个简单的例子:比如你啪啪啪,为了避免弄出人命,肯定要先戴好套套, 然后再啪啪啪是吧~套套戴好 -> 然后啪啪啪,比如你没套套,那啪啪啪的操作就要等待了,直到你把 套套买回来带上,这个时候就可以开始啪啪啪了~一个形象地例子,♪(^∇^*) 异步:和同步则是相对的,当我们执行某个功能后,我们并不需要立即得到结果,我们额可以正常地 做其他操作,这个功能可以在完成后通知或者回调来告诉我们;还是上面那个后台下载的例子,后台下载, 我们执行下载功能后,我们就无需去关心它的下载过程,当下载完毕后通知我们就可以了~

3) Android 为什么要引入异步任务

答:因为Android程序刚启动时,会同时启动一个对应的主线程(Main Thread),这个主线程主要负责处理 与UI相关的事件!有时我们也把他称作UI线程!而在Android App时我们必须遵守这个单线程模型的规则: Android UI操作并不是线程安全的并且这些操作都需要在UI线程中执行! 假如我们在非UI线程中,比如在主线程中new Thread()另外开辟一个线程,然后直接在里面修改UI控件的值; 此时会抛出下述异常: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 另外,还有一点,如果我们把耗时的操作都放在UI线程中的话,如果UI线程超过5s没有响应用于请求,那么 这个时候会引发ANR(Application Not Responding)异常,就是应用无响应~ 最后还有一点就是:Android 4.0后禁止在UI线程中执行网络操作~不然会报: android.os.NetworkOnMainThreadException

以上的种种原因都说明了Android引入异步任务的意义,当然实现异步也不可以不用到我们本节讲解 的AsyncTask,我们可以自己开辟一个线程,完成相关操作后,通过下述两种方法进行UI更新:

  1. 前面我们学的Handler,我们在Handler里写好UI更新,然后通过sendMessage()等的方法通知UI 更新,另外别忘了Handler写在主线程和子线程中的区别哦~
  2. 利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,更新UI时,把Runnable 对象传进来即可~

2.AsyncTask全解析:


1)为什么要用AsyncTask?

答:我们可以用上述两种方法来完成我们的异步操作,加入要我们写的异步操作比较多,或者较为繁琐, 难道我们new Thread()然后用上述方法通知UI更新么?程序员都是比较喜欢偷懒的,既然官方给我 们提供了AsyncTask这个封装好的轻量级异步类,为什么不用呢?我们通过几十行的代码就可以完成 我们的异步操作,而且进度可控;相比起Handler,AsyncTask显得更加简单,快捷~当然,这只适合 简单的异步操作,另外,实际异步用的最多的地方就是网络操作,图片加载,数据传输等,AsyncTask 暂时可以满足初学者的需求,谢谢小应用,但是到了公司真正做项目以后,我们更多的使用第三发的 框架,比如Volley,OkHttp,android-async-http,XUtils等很多,后面进阶教程我们会选1-2个框架进行 学习,当然你可以自己找资料学习学习,但是掌握AsyncTask还是很有必要的!


2)AsyncTask的基本结构:

AsyncTask是一个抽象类,一般我们都会定义一个类继承AsyncTask然后重写相关方法~ 官方API:AsyncTask

  • 构建AsyncTask子类的参数:

  • 相关方法与执行流程:

  • 注意事项:


3.AsyncTask使用示例:

因为我们还没学到Android网络那块,这里照顾下各位初学者,这里用延时 线程来模拟文件下载的过程~后面讲到网络那里再给大家写几个例子~

实现效果图:

布局文件:activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical"  tools:context=".MyActivity">  <TextView  android:id="@+id/txttitle"  android:layout_width="wrap_content"  android:layout_height="wrap_content" />  <!--设置一个进度条,并且设置为水平方向-->  <ProgressBar  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:id="@+id/pgbar"  style="?android:attr/progressBarStyleHorizontal"/>  <Button  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:id="@+id/btnupdate"  android:text="更新progressBar"/>
</LinearLayout> 

定义一个延时操作,用于模拟下载:

public class DelayOperator {  //延时操作,用来模拟下载  public void delay()  {  try {  Thread.sleep(1000);  }catch (InterruptedException e){  e.printStackTrace();;  }  }
}

自定义AsyncTask:

public class MyAsyncTask extends AsyncTask<Integer,Integer,String>
{  private TextView txt;  private ProgressBar pgbar;  public MyAsyncTask(TextView txt,ProgressBar pgbar)  {  super();  this.txt = txt;  this.pgbar = pgbar;  }  //该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法  //触发onProgressUpdate对UI进行操作  @Override  protected String doInBackground(Integer... params) {  DelayOperator dop = new DelayOperator();  int i = 0;  for (i = 10;i <= 100;i+=10)  {  dop.delay();  publishProgress(i);  }  return  i + params[0].intValue() + "";  }  //该方法运行在UI线程中,可对UI控件进行设置  @Override  protected void onPreExecute() {  txt.setText("开始执行异步线程~");  }  //在doBackground方法中,每次调用publishProgress方法都会触发该方法  //运行在UI线程中,可对UI控件进行操作  @Override  protected void onProgressUpdate(Integer... values) {  int value = values[0];  pgbar.setProgress(value);  }
}

MainActivity.java

public class MyActivity extends ActionBarActivity {  private TextView txttitle;  private ProgressBar pgbar;  private Button btnupdate;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  txttitle = (TextView)findViewById(R.id.txttitle);  pgbar = (ProgressBar)findViewById(R.id.pgbar);  btnupdate = (Button)findViewById(R.id.btnupdate);  btnupdate.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar);  myTask.execute(1000);  }  });  }
} 

本节小结:

好的,本节一开始给大家普及了下应用程序,进程,线程,多线程,异步,同步的概念;接着又讲解 了下Android中为何要引入异步操作,然后介绍了下AsyncTask的用法,当然上面也说了,异步操作在网络 操作用的较多,后面在讲解网络操作时会用到这个AsyncTask,敬请期待~本节就到这里,谢谢~

AsyncTask异步任务相关推荐

  1. 【Android 异步操作】AsyncTask 异步任务 ( FutureTask 模拟 AsyncTask 执行过程 | AsyncTask 执行过程回顾 | FutureTask 分析 )

    文章目录 一.FutureTask 使用流程 二.FutureTask 模拟 AsyncTask 执行过程 三.AsyncTask 执行过程回顾 四.FutureTask 分析 一.FutureTas ...

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

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

  3. 【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介 | 使用方法 | AsyncTask 源码分析 )

    文章目录 一.AsyncTask 参数简介 二.AsyncTask 方法简介 三.AsyncTask 基本用法 四.AsyncTask 构造函数源码解析 五.AsyncTask 构造函数相关源码注释 ...

  4. Android异步处理二:AsynTask介绍和使用AsyncTask异步更新UI界面

    做一下如何同构AsyncTask异步任务来更新UI界面. (1)AsyncTask的介绍 通过上图中的AsyncTask的源码结构图可以看到,主要用于重载的方法是doInBackground(),on ...

  5. Android中的AsyncTask异步任务的简单实例

    在  Android中的AsyncTask异步任务的简单介绍 一文中,已经对 安卓 异步任务操作做了简单的介绍,这里,直接将上文中的异步任务做了一个实例,实现异步操作更新UI线程,相比开启子线程更新来 ...

  6. Android中的AsyncTask异步任务的简单介绍

    事件原由: 很多耗时的资源在安卓客户端加载时,必须要开启一个新的线程去操作维护,而如果直接在主线程中加载的话,客户端会直接报出异常,导致程序不能正常使用,而子线程无法直接更新UI,因此客户端提供了   ...

  7. Android之AsyncTask异步任务详解总结

    Android 多线程----AsyncTask异步任务详解 [正文] 本文将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多 ...

  8. android异步任务更新进度条,Android的AsyncTask异步任务浅析

    Android的AsyncTask异步任务浅析 实现原理 内部封装了2个线程池+1个Handler(InternalHandler),1个线程池SerialExecutor任务排队,一个线程池THRE ...

  9. android asynctask异步处理抓取网页,Android处理异步耗时任务,AsyncTask使用教程

    原文链接:http://www.jufanshare.com/content/124.html 本教程附Demo:https://gitee.com/qwertiddler/AsyncTask.git ...

最新文章

  1. 虚拟化帮您打造绿色数据中心
  2. 颠覆传统的电商智能助理-阿里小蜜技术揭秘
  3. 数据结构 二叉树面试笔试编程题集
  4. python getattr函数_python中getattr函数 hasattr函数
  5. 你的代码,“拯救”过多少人?
  6. 【精】沐浴智慧之光:研究查找算法
  7. 值传递和引用传递_C++ 中的值传递和引用传递
  8. linux gdb 执行命令,Linux中gdb命令起什么作用呢?
  9. Java连接HBase数据库,操作HBase数据库
  10. 云计算机基础架构,云计算基础架构的解决方案
  11. C语言删除注册表某个键值,怎么批量快速删除注册表中指定的某个键值
  12. ios 图片裁剪框架_iOS开发图片剪切
  13. EBS功能_Oracle ERP系统借贷关系
  14. Windows常见基本进程三:dumprep or dumprep进程(Dump Reporting Tool启动项)
  15. r语言r-shiny_如何使用R Shiny进行EDA和预测
  16. 2022.04.04树莓派最新镜像问题,树莓派如何设置初始化的账户和密码
  17. 安卓到ios显示无法连接服务器,android-发生SSL错误,无法仅在ios上建立与服务器的安全连接...
  18. 产品上ref和lot是什么意思_产品上的LOT是什么意思?
  19. Ruby/Rails学习教程-Hello Ruby
  20. RDSDRDSPolarDBPolarDB-X的区别

热门文章

  1. 二十、商城 - 商家入驻审核-BCrypt 加密算法(8)
  2. sem_timedwait_C/C++ 修改系统时间,导致sem_timedwait 一直阻塞的问题解决和分析
  3. GCC源码分析(十七) — rtl expand之后
  4. android+桌面歌词,【Android】桌面歌词悬浮效果简单实现
  5. 汽车有眼睛和有眼睛的汽车
  6. Hibernate单向关联1-1
  7. install.wim 大于4G问题解决方案
  8. 【个人笔记】《知了堂》ajax的get及post请求
  9. HP SmartArray P400, poor performance?
  10. 区块链最后拼的是数据规模和数据处理能力