首先AsyncTask是个抽象类,所以如果我们想使用它,需要先创建一个子类去继承并实现它的抽象方法()。在继承AsyncTask时我们可以为AsyncTask类指定3个泛型参数,这三个参数的用途如下。
class UnknownTask extends AsyncTask<Object Params,Object Progress,Object Result>{} 一般都需要重写doInBackground()方法。
1.Params.执行AsyncTask时会需要用到的参数,可用在后台任务中。
2.Progress.后台任务运行时如果需要在界面上显示进度,就使用该泛型。
3.Result.当任务执行完毕,如果需要返回结果,则使用这里指定的泛型作为返回值。
PT:泛型都是泛型类的形式,而不是数据类型,例如泛型需要传入Void,Boolean,Integer而不能传入void,boolean,int。
上面介绍的其实很有点抽象,在这里再来具体描述:
例如class DownloadTask extends AsyncTask<Void,Integer,Boolean>{
......执行逻辑
}
这里把AsyncTask的第一个泛型参数指定为Void,那么在执行AsyncTask的时候不需要传入参数给后台任务。第二个泛型为Integer则表示使用整型数据来作为进度显示单位。第三个泛型参数指定为Boolean,则表示使用布尔型数据来反馈执行结果。可能还是有点笼统,那么设置了这样的参数到底有怎么样的效果呢,下面继续。
一般使用这个AsyncTask需要重写以下四个方法来成功完成对某个Task任务的定制。首先doInBackground是肯定需要用到的,然后还有三个方法是:onPreExecute(),onProgressUpdate(),onPostExecute(Result)。
他们的具体介绍如下,很重要的一点需要记住doInBackground()里的代码都是运行在子线程之中的,在此处可以来处理那些耗时的任务,当然,因为这里运行在子线程所以不能有任何关于UI的操作,什么是属于UI的操作呢,个人理解涉及到更改界面的基本都是UI操作,比如TextView的设置图片,Toast某句话,Button?。。。而log日志的操作则是允许的,因为不涉及UI。
很清楚地看到只有doInBackground是在子线程执行。以及三个泛型对这些方法的传入参数和返回参数类型的影响也都很明显了。并且在doInBackground中可以通过调用publishProgress方法从子线程切换到主线程。!!!
最后,要启动这个任务只需要 new UnknownTask().execute();就OK啦。