AsyncTask官方文档教程整理

 更新时间:2017年04月03日 14:54:21   作者:SAKA  
这篇文章主要跟大家分享了关于AsyncTask官方文档的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

简介

Android给我们提供了一种轻量级的异步任务类AsyncTask。该类中实现异步操作,并提供接口反馈当前异步执行结果及进度,这些接口中有直接运行在主线程中的(如 onPostExecute,onPreExecute等)。

AsyncTask可以轻松正确的使用UI线程,这个类允许你在后台操作,并且不需要使用threads或者handler将结果发布到UI线程。

AsyncTask设计之初就是辅助Thread和Handler的,并且不会生成线程。AsyncTask应该被用于短时间内的操作(最多几秒钟),如果你想要长时间保持线程运行,请使用Executor或者ThreadPoolExecutor或者FutureTask。

AsyncTask在后台运行任务,在UI线程发布结果,定义三个参数,Params, Progress和Result,执行四个步骤,onPreExecute, doInBackground, onProgressUpdate和onPostExecute。

使用方法

AsyncTask必须被继承来使用。子类必须实现至少一个方法(ddoInBackground(Params…)) ,还有一个最常用的方法(onPostExecute(Result)

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
  int count = urls.length;
  long totalSize = 0;
  for (int i = 0; i < count; i++) {
   totalSize += Downloader.downloadFile(urls[i]);
   publishProgress((int) ((i / (float) count) * 100));
   // Escape early if cancel() is called
   if (isCancelled()) break;
  }
  return totalSize;
 }
 protected void onProgressUpdate(Integer... progress) {
  setProgressPercent(progress[0]);
 }
 protected void onPostExecute(Long result) {
  showDialog("Downloaded " + result + " bytes");
 }
}

启动异步任务:

new DownloadFilesTask().execute(url1, url2, url3);

AsyncTasks的范型参数

异步任务使用的参数是:

  • Params, 启动任务时传入的参数
  • Progress, 在后台任务执行时发布到UI线程的进度类型
  • Result, 后台任务执行完成的结果

这三个参数不一定非要指定,可以使用Void来传入空值。

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

4个步骤

  • onPreExecute() ,在应用程序执行前在UI线程上调用。这步通常被用来准备任务开始,例如显示一个进度条。
  • doInBackground(Params…) ,在onPreExecute()方法被调用后立即执行此方法,用来执行长时间的任务。
  • 参数会在这一步传入,最后的结果必须返回。在这步页可以使用publishProgress(Progress...)来发布进度,这些值时在UI线程中发布的,在onProgressUpdate(Progress...)接收。onProgressUpdate(Progress…) , 在publishProgress(Progress...)方法调用后在UI线程调用此方法。执行时间未定义。该方法用于在后台计算仍在执行时,用户界面中显示的进度。例如,它可以用于对进度条进行动画处理或在文本字段中显示日志。
  • onPostExecute(Result) ,在后台计算完成后在UI线程上调用。 后台计算的结果作为参数传递给该步骤。

取消异步任务

任何时候都可以通过调用cancel(boolean)方法来取消任务。

调用此方法将导致对isCancelled()的后续调用返回true。

调用此方法后,onCancelled(Object) ,而不调用onPostExecute(Object)

为了尽可能快地取消任务,应该始终从doInBackground(Object [])中定期检查isCancelled()的返回值(如果可能的话)。

线程规则

  • 必须在UI线程上加载AsyncTask类。
  • 必须在UI线程上创建任务实例。
  • 必须在UI线程上调用execute(Params …)
  • 不要手动调用onPreExecute()onPostExecute(Result)doInBackground(Params …)onProgressUpdate(Progress …)
  • 该任务只能执行一次(如果尝试第二次执行,将抛出异常)。

内存监控

AsyncTask保证所有回调调用都是同步的,使得以下操作在没有显式同步的情况下是安全的。

  • 在构造函数或onPreExecute()中设置成员字段,并在doInBackground(Params …)中引用它们。
  • doInBackground(Params …)中设置成员字段,并在onProgressUpdate(Progress …)onPostExecute(Result)中引用它们。

执行顺序

首次引入时,AsyncTasks在单个后台线程上串行执行。

从DONUT开始,这被更改为一个允许多个任务并行操作的线程池。

从HONEYCOMB开始,任务在单个线程上执行,以避免并行执行引起的常见应用程序错误。

如果真的需要并行执行,则可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Android自定义弹出框dialog效果

    Android自定义弹出框dialog效果

    这篇文章主要为大家详细介绍了Android自定义弹出框dialog效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android RecyclerView四级缓存源码层详细分析

    Android RecyclerView四级缓存源码层详细分析

    RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。接下来讲解RecyclerView的用法
    2022-11-11
  • Android自定义View实现随机验证码

    Android自定义View实现随机验证码

    这篇文章主要介绍了Android自定义View实现随机验证码的相关资料,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android自定义WheelView地区选择三级联动

    Android自定义WheelView地区选择三级联动

    这篇文章主要为大家详细介绍了Android自定义WheelView地区选择三级联动的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android冷启动优化的3个小案例分享

    Android冷启动优化的3个小案例分享

    为了提高App的冷启动耗时,除了在常规的业务侧进行耗时代码优化之外,为了进一步缩短启动耗时,需要在纯技术测做一些优化探索,本期我们从类预加载、Retrofit 、ARouter方面进行了进一步的优化,感兴趣的同学跟着小编一起来看看吧
    2023-07-07
  • 浅谈Android Studio导出javadoc文档操作及问题的解决

    浅谈Android Studio导出javadoc文档操作及问题的解决

    这篇文章主要介绍了浅谈Android Studio导出javadoc文档操作及问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android编程中号码匹配位数修改的方法

    Android编程中号码匹配位数修改的方法

    这篇文章主要介绍了Android编程中号码匹配位数修改的方法,涉及Android编程中参数修改的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android手势识别功能

    Android手势识别功能

    这篇文章主要为大家详细介绍了Android手势识别功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android local.properties 文件读取实例详解

    Android local.properties 文件读取实例详解

    这篇文章主要介绍了Android local.properties 文件读取实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • 详解Android TableLayout表格布局

    详解Android TableLayout表格布局

    表格布局的标签是TableLayout,TableLayout继承了LinearLayout。所以它依然是一个线性布局,通过本文给大家介绍Android TableLayout表格布局,感兴趣的朋友一起学习吧
    2016-02-02

最新评论