AsyncTask概述
AsyncTask是google公司封装的一个轻量级的异步任务类。相信大家对AsyncTask都不陌生,对于执行耗时任务,然后更新UI是一把利器,当然也是替代Thread + Handler 的一种方式。
实际上它内部就是通过Thread + handler实现的。如果没有AsyncTask类,我们完全可以用thread+handler来处理。这个时候就很可能自己回去封装一下thread+handler了。正是因为这类需求很多,google就帮我们封装了一下。其实我们也可以自己封装,但是我相信99%程序员自己封装的东西比不上google的。所以还是有必要学习一下AsyncTask。
AsyncTask:异步任务
---------------------------------------------
异步任务中的泛型:
1.Params:表示执行该任务时,是否需要参数,如果需要,那么需要什么类型的参数
2.Progress:表示执行任务的过程中,是否需要更新进度,如果需要,用什么类型的数据表示进度
3.Result:表示执行任务后,是否需要结果,如果需要,那么使用什么类型表示任务的执行结果
以上确定的数据类型将应用于任务的各方法中,如果不需要某部分的类型,则可以使用java.lang.Void类型表示
异步任务中的方法:
1.doInBackground() -> 该方法是抽象方法,需要被重写,该方法是运行在子线程的方法,用于执行任务的耗时操作,该方法的参数是Params类型的可变参数,返回值是Result类型的数据
2.publishProgress() -> 该方法是需要进度时,在doInBackground()中调用的方法,该方法的参数是Progress类型的可变参数
3.onProgressUpdate() -> 该方法在每次调用publishProgress()后被回调,是运行在主线程的,该方法并不是抽象方法,如果需要更新进度,则应该重写该方法,该方法的参数是Progress类型的可变参数,是调用publishProgress()方法时使用的参数
4.onPostExecute() -> 该方法是在doInBackground()执行完毕之后被回调的方法,是运行在主线程的,该方法并不是抽象方法,如果任务执行完成之后需要更新界面显示,则应该重写该方法,该方法的参数是Result类型的,是doInBackground()方法的返回值
异步任务的特点:
1. 集中管理同一个业务的相关代码
2. 所有任务会依次执行,注意:假设TaskA、TaskB都继承自AsyncTask,并分别创建对象,在执行这2种任务时,这2种任务也会是依次执行的
3. 异步任务是可以取消的,但是,只能取消其主线程的操作,和没有开始的子线程的操作,即,如果子线程(doInBackground())已经开始工作,是不可以中途取消的
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1)Task的实例必须在UI thread中创建
2)execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(),onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。