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

大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述Android 多线程-----AsyncTask详解相关的知识,希望能为你提供帮助。
本篇随笔将讲解一下android的多线程的知识, 以及如何通过AsyncTask机制来实现线程之间的通信。
一、Android当中的多线程
在Android当中, 当一个应用程序的组件启动的时候, 并且没有其他的应用程序组件在运行时, Android系统就会为该应用程序组件开辟一个新的线程来执行。默认的情况下, 在一个相同Android应用程序当中, 其里面的组件都是运行在同一个线程里面的, 这个线程我们称之为Main线程。当我们通过某个组件来启动另一个组件的时候, 这个时候默认都是在同一个线程当中完成的。当然, 我们可以自己来管理我们的Android应用的线程, 我们可以根据我们自己的需要来给应用程序创建额外的线程。
二、Main Thread 和 Worker Thread
【Android 多线程-----AsyncTask详解】在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>


    推荐阅读