1.异步任务(AsyncTask)简介
Android异步任务(AsyncTask)是一个抽象类,通常用于被继承,继承AsyncTask时需要指定如下三个泛型参数。
1.1)Params:启动任务执行的输入参数。比如HTTP请求的URL。
1.2)Process:后台任务完成的进度值的。比如进度条的百分比。
1.3)Result:后台执行任务完成后返回结果。比如String,Boolean。
2.使用AsyncTask的步骤
2.1)创建AsyncTask的子类,并未三个泛型参数指定类型。如果某个泛型参数不需要制定类型,则可将它指定为空。
2.2)实现AsyncTask的如下方法
2.2.1)onPreExecute():该方法将在执行后台耗时操作前被调用。通常该方法用于完成一些初始化的准备工作,比如在界面上显示进度条。
2.2.2)doInBackground(Params…):重写该方法就是后台线程将要完成的任务。任务一旦完成就可以通过return语句来将任务的执行结果返回,如果AsyncTask的第三个泛型参数指定是void,就可以不返回任务执行结果。该方法可以调用publicProgress(Params… Values)方法更新任务的执行速度。
2.2.3)onProgressUpdate(Params… Values):在doInBackground()方法中调用publicProcess()方法更新任务的执行进度后,将会触发此方法。
2.2.4)onPostExecute(Result result):当doInBackground()完成后并通过return语句返回时,系统会自动调用onPreExecute()方法,并将doInBackground()方法的返回值传给该方法。
2.3)调用AsyncTask子类的实例的execute(Params… params)开始执行耗时任务。
3.使用AsyncTask注意点:
3.1)必须在UI线程中创建AsyncTask的实例。
3.2)必须在UI线程中调用AsyncTask的execute()方法。
3.3)AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params…)、onProgressUpdate(Params… Values)方法,不应该由程序员代码调用,而是由Android系统负责调用。
3.4)每个AsyncTask只能被执行一次,多次调用将会引发异常。
4.代码如下:
public class MainActivityClass extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
DownLoadTask task = new DownLoadTask();
task.execute(new URL("http://www.baidu.com"));//开始执行异步任务
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
class DownLoadTask extends AsyncTask<URL,Integer,Boolean>{
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
//准备工作,初始化进度条 对进度条设置.....
progressDialog = new ProgressDialog(MainActivityClass.this);
progressDialog.show();
}
@Override
protected Boolean doInBackground(URL... params) {
int downloadPrecent = doDown(params[0]);//doDown()虚构的一个方法
publishProgress(downloadPrecent);
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
//进度条显示
progressDialog.setMessage(values[0] + "%");
}
@Override
protected void onPostExecute(Boolean result) {
progressDialog.dismiss();
if (result){
//下载完成
}else{
//下载失败
}
}
}
}
本代码简单介绍异步任务的三个泛型参数及重写其中5个方法的执行过程。从代码中可以看出在doInBackground()方法中去执行具体的耗时任务,在onProgressUpdate(Params… Values)方法中进行UI操作(比如进度条显示),在onPostExecute(Result result)方法中执行一些任务的收尾工作。
5.线程与异步任务区别
线程的介绍大家可以参考我的上篇博客http://blog.csdn.net/qq_30960163/article/details/52244304。
Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现 很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新Google引入了Handler和Looper机制,它们均基于消息实现,有时可能消息队列阻塞或其他原因无法准确的使用。AsyncTask优点安全,简单。但缺点也是有的比如一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能 通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵 活。