Android中,为了实现UI线程和worker线程之间的通信,设计了两种方式:Handler机制和AsyncTask机制。
AsyncTask:异步任务,它是一个多线程编程的框架。从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。
AsyncTask介绍:
他有三个泛型,四个方法。
三个泛型:AsyncTask<Params, Progress, Result>
-
Params:指定的是我们传递给异步任务执行时的参数的类型.
-
Progress:指定的是我们的异步任务在执行的时候将执行的进度返回给UI线程的参数的类型,进度的单位.
-
Result:指定的异步任务执行完后返回给UI线程的结果的类型.
四个方法:该框架在执行异步任务的时候,分以下四步执行:
- 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的其他知识点:
-
Cancelling a Task
我们可以在任何时刻来取消我们的异步任务的执行,通过调用 cancel(boolean)方法,调用完这个方法后系统会随后调用isCancelled() 方法并且返回true。如果调用了这个方法,那么在 doInBackgroud() 方法执行完之后,就不会调用onPostExecute() 方法了,取而代之的是调用 onCancelled()方法。为了确保Task已经被取消了,我们需要经常调用 isCancelled() 方法来判断,如果有必要的话。
-
在使用AsyncTask做异步任务的时候必须要遵循的原则:
1)AsyncTask类必须在UI Thread当中加载,在Android Jelly_Bean版本后这些都是自动完成的
2)AsyncTask的对象必须在UI Thread当中实例化 execute方法必须在UI Thread当中调用
3)不要手动的去调用AsyncTask的onPreExecute, doInBackground, publishProgress,onProgressUpdate, onPostExecute方法,这些都是由Android系统自动调用的
4)AsyncTask任务只能被执行一次