Android的异步任务AsyncTask详解_Android

AsyncTask,顾名思义,异步任务。说到异步,最简单的理解就是不同步。再复杂一点理解,就得举例子了。

假设我要去火车站买票,刚到火车站我突然发现我忘了带身份证。怎么办?怎么办!

想办法,想办法!我想我应该找个在学校的同学帮我送过来,因为我不能自己回去拿啊,还要排队呢,走不开。嗯,要找人送过来。但是问题来了,我找人送身份证了,我去排队了,如果排到第一位了身份证还没到怎么办?叮,脑袋上面突然亮了一个小灯泡,机智的我在排队前想到了两种方案:

第一种方案,让售票员等着我,我后面队伍里买票的人也等着我,我一直在窗口第一位置等着同学来送身份证,直到,我的身份证被送来,然后顺利买票。

另一种方案呢,就是我跟售票员说一下,让我在一边等着送身份证,后面的人继续买票,等我的身份证送来的时候我通知下售票员,就可以尽快排到队伍第一位(不一定是立即排到第一位,因为万一有人正在买票,我不能过去打断他)然后买票。

所以呢,选第一种还是第二种?我肯定选第二种,因为选第一种肯定会被后面排队的人骂死,而且还有可能被售票员骂,搞不好还会挨揍,毕竟因为我一个人,浪费了这么多人的时间,也拖慢了售票员的工作效率。

好了,例子就说到这里。在例子里,第二种方法就是异步的。异步往往和多线程有关,而且异步任务也大多是交由一个单独的线程完成,然后返回结果给主线程。这里售票员相当于cpu,而排队买票的人相当于等待被执行的任务,而我是个被标记为异步的任务(因为我知道我带身份证,不能立即买到票,所以排队前就想好了第二种方案),当cpu执行到我这个任务的时候,发现我这个任务可执行的条件(身份证)不具备,所以由我发起了一个异步任务(同学送票),去获取可执行的条件,之后立即把位置让出来,让其他排队的任务继续执行。直到我的身份证拿来,然后立马通知cpu准备接待我。

嗯,差不多就是这样了。开始说正文,android里面的AsyncTask。先上一段官网的引用:

复制代码 代码如下:

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

是英语,虽然我能懂大概是什么意思,但是还是不翻译了,怕误人子弟,等我英语学的再好些再来翻译吧。不过还是要解释下大概的意思,就是说AsyncTask可以在UI线程上做一些后台操作,也能返回操作结果到UI线程上。我们知道UI线程是不能做一些耗时的操作的,但是有了AsyncTask,我们可以这样做了。但是,

复制代码 代码如下:

AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.

对于耗时比较久的任务,还是不建议放在AsyncTask中执行。AysncTask被设计成Thread和Handler的辅助类,并不能执行过于复杂和耗时的任务,这种任务应该用其他方法这里就不说了。AsyncTask最好用于耗时最多只有几秒钟的操作,比如向网络请求个xml或是json之类的网络操作,或是用在程序的初始化界面等等。

下面说下AsyncTask的使用。其实很简单。

首先你需要定义一个AsyncTask的子类,并且必须重写父类的doInBackground(Params...)方法。另外还有onPostExecute(Result)方法也可重写,这个方法在doInBackground之后被自动调用,所以你可以在这里写一些任务完成的通知代码。

先给一个官方的例子:

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");
  }
 }

执行AsyncTask的时候,必须在UI线程中执行,如下语句。

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

可以看到,在继承AsyncTask的时候,有几个泛型类型,如AsyncTask<URL, Integer, Long>,简单解释下。

第一个可以指定输入参数的类型,就是new DownloadFilesTask().execute()的参数(最后传到了doInBackground),这里的参数可以不只一个,因为最后到方法里面,收到的是个数组。
第二个可指定发送进度更新需要的类型,一般都是整型,用在publishProgress(用来在后台进程中发送进度的方法,直接使用的,不用定义)和onProgressUpdate两个方法中。
第三个是AsyncTask返回结果的数据类型,它设置了doInBackground的返回类型,以及onPostExecute的输入参数类型
当然,如果你什么都不需要,可以都使用Void。

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

另外,还有一个可以重写的方法,是onPreExecute(),它在doInBackground之前被调用,所以如果需要的话,你可以重写它然后做一些实例化进度条啊之类的工作。

最后,总结一下:

使用AsyncTask,你要做的是,继承父类,然后重写doInBackground(Params...),在里面实现后台操作,如果有返回结果的话,重写onPostExecute(Result)然后处理后台程序的结果。

如果需要更新进度的话,在onPreExecute()里实例化进度条(也可以不在这),之后在doInBackground(Params...)里面用publishProgress()发布进度值,然后重写onProgressUpdate(Progress...)接收onPreExecute()发布的结果,并添加更新进度条的代码。

以上就是关于Android中异步任务的内容了,希望大家能够喜欢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, asynctask
异步任务
asynctask异步任务、android异步任务、android 异步任务框架、android异步任务取消、android 异步任务队列,以便于您获取更多的相关知识。

时间: 2024-08-04 03:28:25

Android的异步任务AsyncTask详解_Android的相关文章

Android的异步任务AsyncTask详解

AsyncTask,顾名思义,异步任务.说到异步,最简单的理解就是不同步.再复杂一点理解,就得举例子了. 假设我要去火车站买票,刚到火车站我突然发现我忘了带身份证.怎么办?怎么办! 想办法,想办法!我想我应该找个在学校的同学帮我送过来,因为我不能自己回去拿啊,还要排队呢,走不开.嗯,要找人送过来.但是问题来了,我找人送身份证了,我去排队了,如果排到第一位了身份证还没到怎么办?叮,脑袋上面突然亮了一个小灯泡,机智的我在排队前想到了两种方案: 第一种方案,让售票员等着我,我后面队伍里买票的人也等着我

Android Loader 异步加载详解二:探寻Loader内部机制

Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70259914 本文出自[赵彦军的博客] Android Loader 异步加载详解一:基础概念 Android Loader 异步加载详解二:探寻Loader内部机制 在上一篇文章中,讲解了 Loader 的基本概念.这一篇将会用实战的方式来探寻 Android Loader的内部机制.我们准备做一个 读取手

Android Loader 异步加载详解一:基础概念

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70241844 本文出自[赵彦军的博客] Android Loader 异步加载详解一:基础概念 Android Loader 异步加载详解二:探寻Loader内部机制 前言 Android 3.0 中引入了 Loader (加载器),支持轻松在 Activity 或片段中异步加载数据. 加载器具有以下特征: 可用于每个 Activity 和 Fragment. 支持异步加载数据.

Android AIDL——进程通信机制详解_Android

Android  AIDL, Android进程机制通信机制,这里就整理下AIDL 的知识,帮助大家学习理解此部分知识! 什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在形式是一种 .aidl 文件,开发者需要做的就是在该文件中定义进程间通信的接口,编译的时候 IDE 就会根据我们的 .aidl 接口文件生成可供项目使用的 .java 文件,这和

sweet alert dialog 在android studio应用问题说明详解_Android

看到这个sweet-alert-dialog很亲切,因为前端开发本人用的提示就是这个js插件,java牛人很厉害,直接弄成一个java包插件,Good! 下面记录如何引用到工程,并使用: sweet-alert-dialog插件可以直接到github上下载 地址:https://github.com/pedant/sweet-alert-dialog 或者直接到发布好的页面下载: https://github.com/pedant/sweet-alert-dialog/releases 我下载的

Android pdf viewer在android studio应用问题说明详解_Android

之前一直是做.NET开发的,最近需要弄一个新闻app,能力有限,只能借助HTML5 WebAPP+android studio来完成这项工作. android studio主要用WebView来加载发布好的WebApp,打包生产APP. 其中由于显示一些pdf文档,所以研究了一下,记录一下心得,同时也希望帮助到新手们. android 显示网络pdf,基本原理:先将pdf文件通过DownloadManager下载到手机sdk某个文件夹中,然后通过android-pdf-viewer插件进行显示.

Android中HorizontalScrollView使用方法详解_Android

由于移动设备物理显示空间一般有限,不可能一次性的把所有要显示的内容都显示在屏幕上.所以各大平台一般会提供一些可滚动的视图来向用户展示数据.Android平台框架中为我们提供了诸如ListView.GirdView.ScrollView等滚动视图控件,这几个视图控件也是我们平常使用最多的.下面介绍一下HorizontalScrollView的使用和需要注意的点:  HorizontalScrollView是一个FrameLayout  ,这意味着你只能在它下面放置一个子控件,这个子控件可以包含很多

Android编程之SurfaceView实例详解_Android

本文实例讲述了Android编程之SurfaceView用法.分享给大家供大家参考,具体如下: 关于surfaceView相关知识: View和SurfaceView主要区别: 1. View只能在UI线程中刷新,而SurfaceView可以在子线程中刷新 2. SurfaceView可以控制刷新频率 SurfaceView几个重要的方法: 1. 继承SurfaceView 后调用getHolder()方法可以获取到mSurfaceHolder对象这个对于可以控制SurfaceView的绘制 2

Android中异步类AsyncTask用法总结_Android

本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉 这里有两种解释的方法,各有侧重点: 第一种解释: Async Task 简介: AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦 AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Pa