`

AsyncTask

阅读更多
   下面的内容翻译自Android官方网站关于AsyncTask相关介绍。
     AsyncTask提供了一种合适的和简单的方法使用UI线程。这个类允许执行后台操作并把操作结果在UI线程里呈现,且整个过程不需要操作线程和Handler类。
     AsyncTask只是作为Thread和Handler的帮助类,而不是一种通用的线程框架(a generic threading framework)。AsyncTask适用于短时间的后台操作(最多几秒),如果你需要线程长时间的运行,推荐使用有java.util.concurrent包提供的多种API,例如Executor,TheadPoolExecutor和FutureTask。
    一个AsyncTask定义了三个泛型类型,Params、Progress和Result,和四个方法,onPreExecutor,doInBackgroud,onProgressUpdate和onPostExecute。
    AsyncTask必须派生出一个子类才能使用。子类至少重写一个方法(doInBackground(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);
    AsyncTask的三个泛型类型参数:1.Params,传递给异步任务执行的参数类型。2.Progress,在进行后台计算时,前台显示的进度条类型3.Result,后台计算的结果类型。不是所有的类型都会被异步任务类使用。为了标记某个类型不会使用,只要使用Void类型就可以了:
private class MyTask extends AsyncTask<Void, Void, Void> {
   ...
}
    AsyncTask的四个成员方法:当一个异步任务类被执行,需要经过4个步骤:
/* 在异步任务执行前,会被UI线程调用。这个方法一般用来设置异步任务,比如在用户界面显示一个进度条 */
onPreExecute()
/* 当onPreExecute()执行结束后,这个方法会立即被后台线程引用。这个方法用来执行长时间的后台计算。异步任务类的参数会被传递给这个方法。这个方法的计算结果必须返回,并传递给最后一个方法。这个方法还可以调用publishProgress(Progress...)去改变一个或者多个单位的进度条的值。这些值在UI线程呈现,即在onProgressUpdate(Progress...)方法中 */
doInBackgroud(Params...)
/* 在调用publishProgress(Progress...)后被UI线程调用。该方法的执行时机是没有定义的。这个方法用来在用户界面上呈现任何形式的进度条只要后台计算仍然在执行 */
onProgressUpdate(Progress...)
/* 在后台计算完成后这个方法会被UI线程调用。后台计算的结果会被传递给这个方法作为一个参数。这四个回调方法是线程安全的,只要遵守线程规则。*/
onPostExecute(Result)
    取消一个异步任务:一个异步任务可以在任何时候调用cancel(boolean)方法取消异步任务。调用该方法后,在后续调用isCancelled()方法时,该方法会返回true。在调用该方法后,在方法doInBackground(Object[])返回后,onCancelled(Object)方法将代替onPostExecute(Object)。为了保证尽可能快的确认一个任务是否被取消,应该不断地去检查方法isCancelled()的返回值在方法doInBackGround(Object[])中。
    线程规则:为了使该类正常工作,有一些规则必须坚持:1.异步任务类必须在UI线程上被加载。2.异步任务实例必须在UI线程上被创建。3.execute(Params...)必须在UI线程上被调用。4.不要手动的去掉用异步任务类中的四个方法。5.异步任务类只能执行一次。
    执行的顺序:前面已经介绍,异步任务类是串行地在单个后台线程上执行。从DONUT开始,由于线程池,多个任务可以并行的执行。从HONEYCOMB开始,为了避免一般应用程序错误又开始串行的执行在单个线程上。如果确实想并行执行任务,可以调用executeOnExecutor(java.util.concurrent.Executor, Object[])通过THREAD_POOL_EXECTOR(这是一个Executor类)。
分享到:
评论

相关推荐

    Android AsyncTask异步处理下载网页

    Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`AsyncTask`是一个轻量级的框架,设计用来简化在Android应用程序中进行后台操作的过程。 `AsyncTask`包含三...

    AsyncTask类实例详解

    AsyncTask是Android中用于在后台线程执行耗时操作并更新UI的一种机制。它通过封装了线程管理和与主线程的交互,简化了在UI线程中处理异步任务的流程。下面我们将深入探讨AsyncTask的使用、原理以及如何更新UI。 ...

    AsyncTask结合HttpUrlConnection的例子

    在Android开发中,异步处理是非常重要的一环,特别是在与服务器进行数据交互时,为了保持UI线程的流畅性,避免出现"应用无响应"(ANR)的情况,开发者通常会使用`AsyncTask`。本例子是关于如何将`AsyncTask`与`...

    android中AsyncTask的用法

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

    AsyncTask加载网络图片,实现进度条的更新

    `AsyncTask`是Android提供的一种轻量级的并发工具,用于在后台线程执行任务,并在主线程更新UI。在本示例中,我们将深入探讨如何使用`AsyncTask`来加载网络图片并实时更新进度条。 首先,我们需要理解`AsyncTask`的...

    AsyncTask下载网络图片 进度条提示

    `AsyncTask`是Android提供的一种轻量级的异步处理机制,它可以帮助我们在主线程中轻松地执行后台任务,同时更新UI。本篇文章将详细探讨如何使用`AsyncTask`来实现网络图片的下载,并且展示进度条提示。 `AsyncTask`...

    Android AsyncTask 源码解析

    **Android AsyncTask 源码解析** AsyncTask 是 Android 平台上一个非常重要的工具类,用于在后台线程执行耗时操作,然后在 UI 线程更新结果,从而避免了因长时间运行任务而导致的 ANR(Application Not Responding...

    Handler与AsyncTask使用示例

    在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个非常重要的概念,它们主要用于处理应用程序的异步操作和线程通信。本文将深入探讨这些知识点,并通过实例来展示它们如何协同工作。 首先,`Handler`是...

    Android AsyncTask用法和异步加载图片.rar

    Android提供了一种轻量级的机制来在后台执行这些任务,即`AsyncTask`。本资料包主要讲解了如何使用`AsyncTask`进行异步加载图片,这对于在UI线程中保持流畅用户体验至关重要。 `AsyncTask`是Android SDK中的一个类...

    android任务后台处理 asyncTask封装

    `AsyncTask`是Android提供的一种轻量级的异步处理机制,它能让我们在后台线程执行耗时操作,并在完成后更新主线程中的UI。下面我们将深入探讨`AsyncTask`的工作原理及其封装方法。 `AsyncTask`的核心在于三个泛型...

    01_AsyncTask_演示线程阻塞

    `AsyncTask`是Android提供的一种轻量级的异步任务处理框架,它允许开发者在后台线程执行耗时操作,然后在UI线程更新结果,避免了阻塞主线程导致的ANR(Application Not Responding)问题。这篇我们将深入探讨`...

    Android中异步类AsyncTask用法总结

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

    一个AsyncTask的Demo

    AsyncTask是Android平台中用于在后台执行耗时操作并更新UI的一种工具类。它主要设计用来简化异步处理,特别是那些需要与用户界面交互的任务。在这个"AsyncTask的Demo"中,我们将深入探讨AsyncTask的工作原理及其核心...

    Android 线程AsyncTask逐步在list中加入条目

    在这个"Android 线程AsyncTask逐步在list中加入条目"的例子中,我们首先会创建一个`AsyncTask`子类,如`LoadDataTask`,继承自`AsyncTask`。`doInBackground()`方法将用于生成数据(可能是从网络请求或本地数据库...

    AsyncTask的示例代码

    AsyncTask是Android开发中用于在后台执行任务并更新UI的重要工具。它允许开发者在主线程之外执行耗时操作,如网络请求、数据库操作等,同时能够方便地在工作完成时更新UI,避免了直接在主线程中进行这些操作导致的...

    面向对象思想实现AsyncTask类的复用

    在Android开发中,AsyncTask是一种轻量级的异步处理工具,用于在后台线程执行耗时操作,然后在UI线程更新结果。本篇文章将深入探讨如何利用面向对象的思想来实现AsyncTask类的复用,提高代码的可维护性和灵活性。 ...

    AndEngine_分析之三-----AsyncTask_BaseActivity备忘

    ### AndEngine分析之三——AsyncTask与BaseActivity深入解析 #### 一、AsyncTask概述 在AndEngine项目中,为了实现界面更新等操作时避免主线程阻塞的问题,使用了`AsyncTask`来处理后台任务。`AsyncTask`提供了一...

    AsyncTask加载网络图片

    在Android开发中,异步任务(AsyncTask)是一种常见的用于执行后台操作并更新UI线程的工具,尤其在处理耗时任务,如加载网络图片时非常有用。AsyncTask提供了简单的接口,使得开发者可以在后台线程中执行计算,然后...

    Android异步请求之AsyncTask

    `AsyncTask`是Android SDK提供的一种轻量级的异步处理机制,它使得开发者能够在后台线程执行任务,并在UI线程更新结果,避免了主线程被阻塞的风险。下面将详细解释`AsyncTask`的原理、使用方法以及注意事项。 ### ...

    AsyncTask的cancel的有效用法

    在Android开发中,AsyncTask是一种常用的轻量级异步任务处理框架,用于在后台线程执行耗时操作,然后在UI线程更新结果。当我们需要取消一个正在运行的AsyncTask时,就需要理解并正确使用`cancel`方法。本文将深入...

Global site tag (gtag.js) - Google Analytics