`

Android 多线程-----AsyncTask详解

阅读更多

本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。

一、Android当中的多线程

在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新的线程来执行。默认的情况下,在一个相同Android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为Main线程。当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的。当然,我们可以自己来管理我们的Android应用的线程,我们可以根据我们自己的需要来给应用程序创建额外的线程。

二、Main Thread 和 Worker Thread

在Android当中,通常将线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread。

当一个应用程序运行的时候,Android操作系统就会给该应用程序启动一个线程,这个线程就是我们的Main Thread,这个线程非常的重要,它主要用来加载我们的UI界面,完成系统和我们用户之间的交互,并将交互后的结果又展示给我们用户,所以Main Thread又被称为UI Thread。

Android系统默认不会给我们的应用程序组件创建一个额外的线程,所有的这些组件默认都是在同一个线程中运行。然而,某些时候当我们的应用程序需要完成一个耗时的操作的时候,例如访问网络或者是对数据库进行查询时,此时我们的UI Thread就会被阻塞。例如,当我们点击一个Button,然后希望其从网络中获取一些数据,如果此操作在UI Thread当中完成的话,当我们点击Button的时候,UI线程就会处于阻塞的状态,此时,我们的系统不会调度任何其它的事件,更糟糕的是,当我们的整个现场如果阻塞时间超过5秒钟(官方是这样说的),这个时候就会出现 ANR (Application Not Responding)的现象,此时,应用程序会弹出一个框,让用户选择是否退出该程序。对于Android开发来说,出现ANR的现象是绝对不能被允许的。

另外,由于我们的Android UI控件是线程不安全的,所以我们不能在UI Thread之外的线程当中对我们的UI控件进行操作。因此在Android的多线程编程当中,我们有两条非常重要的原则必须要遵守:

  • 绝对不能在UI Thread当中进行耗时的操作,不能阻塞我们的UI Thread
  • 不能在UI Thread之外的线程当中操纵我们的UI元素

三、如何处理UI Thread 和 Worker Thread之间的通信

既然在Android当中有两条重要的原则要遵守,那么我们可能就有疑问了?我们既不能在主线程当中处理耗时的操作,又不能在工作线程中来访问我们的UI控件,那么我们比如从网络中要下载一张图片,又怎么能将其更新到UI控件上呢?这就关系到了我们的主线程和工作线程之间的通信问题了。在Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制(这种方式在后面的随笔中将详细介绍),还有一种就是今天要详细讲解的 AsyncTask 机制。

四、AsyncTask

AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。

怎么来理解AsyncTask呢?通俗一点来说,AsyncTask就相当于Android给我们提供了一个多线程编程的一个框架,其介于Thread和Handler之间,我们如果要定义一个AsyncTask,就需要定义一个类来继承AsyncTask这个抽象类,并实现其唯一的一个 doInBackgroud 抽象方法。要掌握AsyncTask,我们就必须要一个概念,总结起来就是: 3个泛型,4个步骤。

3个泛型指的是什么呢?我们来看看AsyncTask这个抽象类的定义,当我们定义一个类来继承AsyncTask这个类的时候,我们需要为其指定3个泛型参数:

AsyncTask <Params, Progress, Result>
  • Params: 这个泛型指定的是我们传递给异步任务执行时的参数的类型
  • Progress: 这个泛型指定的是我们的异步任务在执行的时候将执行的进度返回给UI线程的参数的类型
  • Result: 这个泛型指定的异步任务执行完后返回给UI线程的结果的类型

我们在定义一个类继承AsyncTask类的时候,必须要指定好这三个泛型的类型,如果都不指定的话,则都将其写成Void,例如:

AsyncTask <Void, Void, Void>

4个步骤:当我们执行一个异步任务的时候,其需要按照下面的4个步骤分别执行

  • 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控件上

为什么我们的AsyncTask抽象类只有一个 doInBackground 的抽象方法呢??原因是,我们如果要做一个异步任务,我们必须要为其开辟一个新的Thread,让其完成一些操作,而在完成这个异步任务时,我可能并不需要弹出要给ProgressDialog,我并不需要随时更新我的ProgressDialog的进度条,我也并不需要将结果更新给我们的UI界面,所以除了 doInBackground 方法之外的三个方法,都不是必须有的,因此我们必须要实现的方法是 doInBackground 方法。

摘自:

http://jackyrong.iteye.com/blog/1336299

http://www.cnblogs.com/xiaoluo501395377/p/3430542.html

分享到:
评论

相关推荐

    Android AsyncTask多线程详解

    Android Asynctask 先小试牛刀,了解一下各个方法执行过程,关注博客http://himici.com/

    12_Android 多线程AsyncTask详解

    Android中的多线程处理是应用程序性能优化的关键,特别是当涉及到UI更新和长时间运行的任务时。在Android系统中,每个应用程序都有一个主线程(Main Thread),也称为UI线程,负责处理用户交互和绘制用户界面。由于...

    android-support-v4.jar.zip

    《Android Support Library v4详解》 在Android应用开发中,Android Support Library v4是一个至关重要的组件,它提供了对Android API Level 4及更高版本的向下兼容性,使得开发者可以使用最新的API特性,同时确保...

    最新版android-support-v4.jar

    **Android Support Library v4详解** Android Support Library v4是一个重要的组件,它为Android应用程序提供了向后兼容的功能。这个库使得开发者能够使用最新的API特性,即使目标设备运行的是较旧版本的Android...

    android-ocr-master,android-ocr-master

    【Android OCR(光学字符识别)项目详解】 在移动设备上实现OCR(Optical Character Recognition,光学字符识别)是一项技术挑战,它允许应用自动识别并转换图像中的文本为可编辑的数据。"android-ocr-master"是一...

    Android多线程详解与Demo

    本文将深入探讨Android多线程的使用,包括其原理、常见方法以及如何通过实例进行实践。 首先,我们需要理解Android主线程,也被称为UI线程,它的主要任务是处理用户界面事件,如触摸事件、绘制视图等。如果在这个...

    Android多线程AsyncTask详解

    "Android多线程AsyncTask详解" Android多线程AsyncTask详解主要为大家详细介绍了Android多线程AsyncTask的相关资料,具有一定的参考价值,本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来...

    android-support-v4

    5. **AsyncTask**:v4库提供了对`android.support.v4.os.AsyncTask`的扩展,增强了线程管理,特别是与Fragment的交互,使异步任务在Fragment的生命周期内更容易管理。 6. **SharedPreferences**的改进:`android....

    android-support-v4.jar

    《Android Support Library v4详解——实现手机摄像头调用的关键组件》 在Android应用开发中,为了确保应用的兼容性和功能的全面性,开发者经常会引入一些关键的库文件,其中之一便是"android-support-v4.jar"。这...

    android-support-v4-25

    《Android Support Library v4详解》 Android Support Library v4,简称v4库,是Google为开发者提供的一款重要的兼容库,其版本号为25.0.3,适用于Android 7.1系统。这个库的主要目的是为了让开发者能够在较旧版本...

    Android多线程处理 详解

    ### Android多线程处理详解 #### 一、Android进程与线程基础 在深入探讨Android中的多线程处理之前,我们需要先理解Android的基本进程和线程模型。 **Android进程:** 当一个Android应用首次启动时,系统会为该...

    Android_AsyncTask_详解

    ### Android AsyncTask 详解 #### 一、AsyncTask 概述 `AsyncTask` 是 Android 提供的一个用于执行后台任务的轻量级框架。它能够帮助开发者轻松地在后台线程执行耗时的操作,并且更新 UI 界面而无需直接操作线程和...

    android-async-http-master

    Android平台上的网络操作通常涉及到线程管理、数据解析等多个复杂环节,而`android-async-http`库则为开发者提供了一个简单易用的异步HTTP客户端,大大简化了这些工作。本文将深入探讨`android-async-http-master`...

    android多线程

    ### Android多线程详解 #### 一、进程与线程概览 在深入探讨Android多线程之前,我们首先理解进程和线程的基本概念。**进程**是正在运行的程序实例,每个进程拥有自己独立的内存空间和系统资源。而**线程**则是...

    详解Android中用于线程处理的AsyncTask类的用法及

    早期版本使用单线程执行任务,后来改为多线程,但由于多线程可能导致线程安全问题,从 Android 3.0 开始,又改回了单线程模式。因此,开发者需要了解目标设备的 Android 版本,以便正确理解和使用 AsyncTask。 总的...

    最新完整的android-support-v4

    5. **AsyncTask**:AsyncTask是一种轻量级的多线程解决方案,用于执行后台操作并在UI线程中更新结果。v4库提供了对AsyncTask的支持,使其在低版本Android上可用。 6. **NotificationCompat**:此组件提供了向后兼容...

Global site tag (gtag.js) - Google Analytics