使用AsyncTask运行异步任务
Android为在后台进行处理提供了两种可选方法。(1)AsyncTask类允许定义将在后台执行的操作,并提供了可以用来监控进度以及在GUI线程上发布结果的事件处理程序。
(2)也可以实现自己的线程,使用Handler类来与GUI线程同步,然后更新UI。
我们今天主要讲述AsyncTask的用法:
1、AsyncTask类提供了一种简单便捷的机制,可以将费时的操作移入后台线程。将事件处理与GUI线程进行同步,允许通过更新视图和其他UI元素来报告进度,或者在任务完成时发布结果。AsyncTask处理线程创建、管理和同步等全部工作,它可以用来创建一个异步任务,该任务由两部分组成:将在后台执行的处理,以及在处理完成后执行的UI更新。
2、AsyncTask是抽象类。AsyncTask定义了三种泛型类型Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。(输入参数)
Progress 后台任务执行的百分比。(报告进度的值)
Result 后台执行任务最终返回的结果,比如String。(结果值)
如果不需要或者不想使用输入参数、更新进度或报告最终结果,则只需为其中一种或者全部类型指定void即可。
3、AsyncTask的执行分为四个步骤,每一步对应一个回调方法。
a、子类化AsyncTask
b、实现AsyncTask中定义的下面一个或多个方法:
onPreExecute(),该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,例如在界面上显示一个进度条。
doInBackground(Params...),将在onPreExecute方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result),在doInBackground执行完成后,onPostExecute
方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread。
4、为了正确的使用AsyncTask类,以下几条必须遵守的准则:
a、Task的实例必须在UI thread中创建
b、execute方法必须在UI thread中调用
c、不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)这几个方法
d、该task只能被执行一次,否则多次调用时将会出现异常
5、Java代码实现:
private class MyAsyncTask extends AsyncTask<String,Integer,Integer>{
@Overrid
protected void onPreExecute() {
//更新进度通知或其他UI元素
}
@Override
protected void onProgressUpdate(Integer...progress){
//更新进度条通知或其他UI元素
}
@Overrid
protected void onPostExecute(Integer...result){
//通知UI更新、对话框或通知报告结果
}
@Overrid
protected Integer doInBackground(String...parameter){
//返回(将传递给onPostExecute的值)结果
}