ǰλã >> Android >> Android 多线?AsyncTask详解
  ϸ

Android 多线?AsyncTask详解

ȶȣ285   ʱ䣺2016-04-28 04:09:23.0
Android 多线?----AsyncTask详解

?随笔将?解一下Android的?线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信?/p>

?、Android当中的?线程

在Android当中,当??用程序的组件?的时候,并且没有其他的应用程序组件在运?时,Android系统就会为?应用程序组件?辟一?的线程来执?。默认的情况下,在一?同Android应用程序当中,其里面的组件都?行在同一?程里面的,这?程我?之为Main线程。当我们通过某个组件来启动另??件的时?,这个时?默认都?同一?程当?成的。当然,我们??来?理我?Android应用的线程,我们?根据我们?的需要来给应用程序创建?外的线程?/p>

二?Main Thread ?Worker Thread

在Android当中,?常将线程分为两种,?种叫做Main Thread,除了Main Thread之?的线程都?为Worker Thread?/p>

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

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

另?,由于我?Android UI控件?程不安全的,?以我?能在UI Thread之?的线程当??我们的UI控件进?操作。因此在Android的?线程编程当中,我?两条非常重?的原则必须?遵守?/p>

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

三??何?理UI Thread ?Worker Thread之间的?信

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

四?AsyncTask

AsyncTask:异步任务,从字?来?,就?我们的UI主线程运行的时?,异?的完成一些操作?AsyncTask允?我们的执行一?步的任务在后台?我?以将耗时的操作放在异步任务当?执?,并随时将任务执行的结果返回给我?UI线程来更新我?UI控件。?过AsyncTask我们?轻松的解决?线程之间的?信???/p>

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

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

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

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

AsyncTask <Void, Void, Void>

4??骤:当我?行一?步任务的时?,其需要按照下面的4??骤分??/p>

  • onPreExecute(): 这个方法?执?异?任务之前的时候执行,并且?UI Thread当中执?的,通常我们在这?法里做一些UI控件的初始化的操作,例?弹出要给ProgressDialog
  • doInBackground(Params... params): 在onPreExecute()方法执?完之后,会马上执行这?法,这个方法就是来?理异步任务的方法,Android操作系统会在后台的线程池当中??个worker thread来执行我?这个方法,所以这?法是在worker thread当中执?的,这个方法执?完之后就?将我?执?结果发?给我们的最后一?onPostExecute 方法,在这个方法里,我们?从网络当?取数??些?时的操?/li>
  • onProgressUpdate(Progess... values): 这个方法也是在UI Thread当中执?的,我们在异步任务执行的时?,有时候需要将执?的进度返回给我们的UI界面,例如下载一张网络图片,我们?要时刻显示其下载的进度,就可以使用这?法来更新我们的进度?这?法在调用之前,我?要在 doInBackground 方法?用一?publishProgress(Progress) 的方法来将我?进度时时刻刻传?给 onProgressUpdate 方法来更?/li>
  • onPostExecute(Result... result): 当我?异?任务执?完之后,就会将结果返回给这个方法,这?法也?UI Thread当中调用的,我们?将返回的结果显示在UI控件?/li>

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

摘自?/p>

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

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