`
苗振忠
  • 浏览: 59539 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android中异步类AsyncTask的理解

 
阅读更多

最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉奋斗

这里有两种解释的方法,各有侧重点:

第一种解释:

Async Task 简介:
AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
  Params 启动任务执行的输入参数,比如HTTP请求的URL。
  Progress 后台任务执行的百分比。
  Result 后台执行任务最终返回的结果,比如String。

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
  1) 子类化Async1Task
  2) 实现AsyncTask中定义的下面一个或几个方法
   onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
   doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
   onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
   onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
  1) Task的实例必须在UI thread中创建
  2) execute方法必须在UI thread中调用
  3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
  4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。

需要说明AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。

第二种解释:

AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数:

1)准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。

2)正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。

3)进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。

4)完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。

5)取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用

AsyncTask的构造函数有三个模板参数:

(1)Params,传递给后台任务的参数类型。

(2)Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)

(3)Result, 后台执行返回的结果的类型。

AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可

第三:关于AsynTask与Handler的一些区别:

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

使用的优点:

a. 简单,快捷

b.过程可控

使用的缺点:

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

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

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

使用的优点:

a.结构清晰,功能定义明确

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

使用的缺点:

a.在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
分享到:
评论

相关推荐

    Android中异步类AsyncTask用法总结

    AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...

    Android异步请求之AsyncTask

    通过理解并熟练运用`AsyncTask`,开发者可以更好地实现Android应用的异步处理,提升用户体验。在实际开发中,还需要根据具体需求选择合适的异步处理策略,例如使用`IntentService`、`Handler`、`LiveData`或现代的`...

    Android 异步任务AsyncTask

    下面将详细阐述Android异步任务AsyncTask的使用、原理以及如何利用它发送POST请求并获取JSON字符串。 AsyncTask的工作流程主要包括三个步骤:onPreExecute()、doInBackground()和onPostExecute()。首先,当调用...

    Android 使用AsyncTask异步更新UI界面

    `AsyncTask`是Android SDK提供的一种轻量级的异步任务处理类,它简化了在后台线程中执行任务并在UI线程中更新结果的过程。`AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、...

    android中AsyncTask的用法

    在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...

    异步操作类AsyncTask

    对于深入理解Android的多线程编程,`AsyncTask`是一个重要的起点,但随着Android版本的更新,建议开发者了解并掌握更现代的异步处理技术,如`Coroutines`和`ViewModel`配合`LiveData`,以获得更好的性能和可维护性。...

    Android用AsyncTask异步加载图片(新)

    本篇文章将深入探讨如何在Android中使用`AsyncTask`来异步加载网络图片。 首先,我们了解`AsyncTask`的基本结构。`AsyncTask`有三个泛型参数:`Params`, `Progress`, 和 `Result`。在本例中,`Params`通常是网络...

    Android studio异步数据加载ListView+Adapter+AsyncTask

    本教程将详细讲解如何在Android Studio中结合ListView、Adapter和AsyncTask实现异步数据加载。 首先,我们需要了解ListView的基本用法。ListView是一种可以滚动并显示多个同种类型的视图组件,通过Adapter进行数据...

    Android的AsyncTask异步任务

    本篇文章将深入探讨Android的AsyncTask异步任务,以及如何在实践中应用。 首先,Android是一个基于事件驱动的系统,主线程(UI线程)负责处理用户交互,而复杂的计算或网络请求等耗时操作应在后台线程中执行,以免...

    Android Handler AsyncTask 异步加载

    总的来说,理解并熟练掌握Handler和AsyncTask是Android开发的基础,它们能帮助开发者有效地处理异步任务,提高应用的性能和用户体验。在实际开发中,根据具体场景选择合适的方法,同时关注Android API的变化,适时...

    Android开发AsyncTask异步处理任务

    在Android应用开发中,AsyncTask是一个非常重要的工具类,它为开发者提供了在UI线程之外执行耗时操作的能力,从而避免了主线程被阻塞导致的ANR(Application Not Responding)错误。这个博文主要围绕Android开发中的...

    异步任务Asynctask源码与反编译对比

    总之,理解AsyncTask的源码及其反编译版本,可以帮助开发者更好地掌握Android异步编程的原理,从而优化应用程序性能,提高用户体验。通过对比源码与反编译代码,我们可以深入了解Android系统如何调度和管理任务,这...

    Android的异步任务AsyncTask详解

    在Android开发中,异步处理是一项关键技能,用于在不影响用户界面(UI)响应性的前提下执行后台任务。AsyncTask是Android提供的一种轻量级异步处理机制,它简化了在UI线程与后台线程之间传递数据的过程。在本文中,...

    android异步任务设计思详解(AsyncTask)

    Android中的异步任务设计主要体现在`AsyncTask`类上,它是Android SDK提供的一种方便快捷的多线程解决方案,用于在后台执行耗时操作,并在完成后更新UI。`AsyncTask`的广泛使用是因为它简化了线程与主线程之间的通信...

    Android AsyncTask 异步下载基础篇

    在Android应用开发中,异步处理是至关重要的,因为它能够避免主线程被阻塞,从而提升用户体验。...通过实践`AsyncTaskDemo`,你可以更好地理解如何在实际项目中应用`AsyncTask`进行图片的异步下载。

    Android-详细解读AsyncTask的黑暗面以及一种替代方案

    在Android开发中,AsyncTask是一种常用的轻量级异步任务处理框架,它使得开发者可以在UI线程之外执行耗时操作,以避免应用因为阻塞主线程而引发的ANR(Application Not Responding)错误。然而,尽管AsyncTask简单...

    A0403异步任务AsyncTask1

    AsyncTask 是 Android 中用于在后台线程执行耗时任务并更新 UI 的工具,它通过异步处理避免阻塞主线程,保证应用的流畅性。在使用 AsyncTask 时,我们需要了解以下几个核心知识点: 1. **AsyncTask 的泛型类型**: ...

    Android开发之AsyncTask机制及使用细节例子源码

    在Android应用开发中,异步任务(AsyncTask)是一个常用工具,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免阻塞用户界面。AsyncTask的使用和内部机制对于任何Android开发者来说都至关重要。让我们深入...

Global site tag (gtag.js) - Google Analytics