详解Android中AsyncTask机制

 更新时间:2015年12月29日 10:54:15   作者:我爱物联网  
在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是今天要详细讲解的 AsyncTask 机制,对android中asynctask相关知识感兴趣的朋友一起学习吧

在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是今天要详细讲解的 AsyncTask 机制。

AsyncTask                                                                               

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我们如果要定义一个AsyncTask,就需要定义一个类来继承AsyncTask这个抽象类,并实现其唯一的一个 doInBackgroud 抽象方法。

3个泛型参数:

AsyncTask <Params, Progress, Result>

 •Params: 启动任务执行的输入参数,比如HTTP请求的URL。
 •Progress: 台任务执行的百分比。
 •Result: 后台执行任务最终返回的结果,比如String。

如果都不指定的话,则都将其写成Void,例如:

AsyncTask <Void, Void, Void> •onPreExecute(): 这个方法是在执行异步任务之前的时候执行,并且是在UI Thread当中执行的,通常我们在这个方法里做一些UI控件的初始化的操作,例如弹出要给ProgressDialog

 •doInBackground(Params... params): 在onPreExecute()方法执行完之后,会马上执行这个方法,这个方法就是来处理异步任务的方法,Android操作系统会在后台的线程池当中开启一个worker thread来执行我们的这个方法,所以这个方法是在worker thread当中执行的,这个方法执行完之后就可以将我们的执行结果发送给我们的最后一个 onPostExecute 方法,在这个方法里,我们可以从网络当中获取数据等一些耗时的操作

 •onProgressUpdate(Progess... values): 这个方法也是在UI Thread当中执行的,我们在异步任务执行的时候,有时候需要将执行的进度返回给我们的UI界面,例如下载一张网络图片,我们需要时刻显示其下载的进度,就可以使用这个方法来更新我们的进度。这个方法在调用之前,我们需要在 doInBackground 方法中调用一个 publishProgress(Progress) 的方法来将我们的进度时时刻刻传递给 onProgressUpdate 方法来更新

 •onPostExecute(Result... result): 当我们的异步任务执行完之后,就会将结果返回给这个方法,这个方法也是在UI Thread当中调用的,我们可以将返回的结果显示在UI控件上
 •onCancelled(): 用户调用取消时,要做的操作

 代码    

public class yibu extends AsyncTask<Integer, Integer, String> {
 private int num = 0;
 private TextView text;
 public yibu(TextView textfrom) {
  // TODO 自动生成的构造函数存根
  this.text = textfrom;//传递进来一个TextView
 }
 @Override
 protected void onPostExecute(String result) {
  // TODO 自动生成的方法存根
  super.onPostExecute(result);
  text.setText("异步操作执行结束" + result);
 }
 @Override
 protected void onPreExecute() {
  // TODO 自动生成的方法存根
  super.onPreExecute();
  text.setText("开始执行异步操作");
 }
 @Override
 protected void onProgressUpdate(Integer... values) {
  // TODO 自动生成的方法存根
  super.onProgressUpdate(values);
  int value = values[0];
  System.out.println(value);
 }
 @Override
 protected String doInBackground(Integer... param) {
  // TODO 自动生成的方法存根 
  for(;num<10;num++)
  {
   publishProgress(num);//调用onProgressUpdate()
  }
  return num + param[0].intValue() + "";//调用onPostExecute,值直接传进去
 }
}

PS:AsyncTask和Handler对比

1 ) AsyncTask实现的原理,和适用的优缺点

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

使用的优点:

简单,快捷

 过程可控   

使用的缺点:

在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

2 )Handler异步实现的原理和适用的优缺点

在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。

使用的优点:

结构清晰,功能定义明确

对于多个后台任务时,简单,清晰

使用的缺点:

在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

相关文章

  • Android实现使用微信登录第三方APP的方法

    Android实现使用微信登录第三方APP的方法

    这篇文章主要介绍了Android实现使用微信登录第三方APP的方法,结合实例形式分析了Android微信登录APP的操作步骤与具体功能实现技巧,需要的朋友可以参考下
    2016-11-11
  • Android Studio通过Artifactory搭建本地仓库优化编译速度的方法

    Android Studio通过Artifactory搭建本地仓库优化编译速度的方法

    这篇文章主要介绍了Android Studio通过Artifactory搭建本地仓库优化编译速度的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Android原生态实现分享转发功能实例

    Android原生态实现分享转发功能实例

    大家好,本篇文章主要讲的是Android原生态实现分享转发功能实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • android文字描边功能的实现

    android文字描边功能的实现

    本文介绍的是android文字描边功能的实现,文字描边的功能在开发中还是听实用的,有需要的可以参考学习
    2016-07-07
  • Android中RecyclerView实现简单购物车功能

    Android中RecyclerView实现简单购物车功能

    这篇文章主要为大家详细介绍了Android中RecyclerView实现简单购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Android 实现右滑返回功能

    Android 实现右滑返回功能

    右滑返回功能在ios上非常实用,因为它的返回键在左上角,下面脚本之家小编给大家带来了Android 实现右滑返回功能,感兴趣的朋友一起看看吧
    2018-04-04
  • Android 手机卫士实现平移动画示例

    Android 手机卫士实现平移动画示例

    这篇文章主要介绍了Android 手机卫士实现平移动画的实例代码,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • Android多媒体应用使用SoundPool播放音频

    Android多媒体应用使用SoundPool播放音频

    这篇文章主要为大家详细介绍了Android多媒体应用使用SoundPool播放音频,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android仿QQ空间主页面的实现

    Android仿QQ空间主页面的实现

    今天模仿安卓QQ空间,打开程序的启动画面和导航页面我就不做了,大家可以模仿微信的那个做一下,很简单。这次主要做一下主页面的实现,感兴趣的朋友可以参考下
    2013-01-01
  • sqlite查询结果在listview中展示的实现

    sqlite查询结果在listview中展示的实现

    下面小编就为大家带来一篇sqlite查询结果在listview中展示的实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04

最新评论