1,简介:
首先要明白,这个是一个抽象类。咱们如果想用的话,必须要继承AsyncTask,继承时候的三个参数的解释,请看第3点。实现里面的方法,里面的方法和执行顺序,请看第4点。
在使用的时候,先生成该对象,然后执行execute(Params)方法,其中方法之中传入的A参数,会在这个里面不仅包含了Handle和Thread,而且加入了线程池。
2,线程池
线程池的作用至关重要。
举例说明: 一个layout之中有个imageView需要更新,咱们为了防止UI线程阻塞,所以新开线程进行获取imageView,然后在主线程之中进行更新imageView,如果有1000个imageView需要更新,那么就会开启1000个线程,这是十分可怕的事情。所以,线程池十分重要。
实现线程池的方法有两种ThreadPoolTask和AsyncTask,通过对比可以发现,ExecutorService相比AsyncTask,并发能力更强,加载的速度也更快,AsyncTask在加载过程中明显变现出顺序性,加载的速度要慢一些。 (这段话摘自前辈:http://blog.csdn.net/carrey1989/article/details/12002033,在此表示感谢)
因为工作中,领导要求按照顺序显示,略慢一点不影响,所以用的是AsyncTask。
3,总述:
public class bbb extends AsyncTask<Params,Progress, Result> {
........实现代码,此处省略....}
咱们可以看见,bbb类之中传入了A,B,C3个类型的参数,这3个参数几乎可以是任意类型。
而且代表一定的意义。
Params,启动任务执行时候输入的参数,由外部传入,也就是外面生成对象,
执行的execute(A)传入的A,可以是URI,URL,String等等等等。
该参数作用于doInBackground(Params... params)的输入参数类型。
Progress,后台任务执行的百分比,一般都是用来更新UI空间的进度条之类的东西。
该参数作用于onProgressUpdate(Progress[] values)的输入参数类型。
Result,该类执行完成之后,最后返回的结果,可以是bitmap等等等等。
该参数作用于onPostExecute(Result result)的输入参数类型,
以及doInBackground(Params... params)的返回参数类型。
(这句我老忘记写。。而且我觉得也蛮重要的,每次上班途中突然想起来,
到办公室以后忙的就忘记了。。
然后第二天又想起来了。。没错你猜对了,到办公室又忘记了。。
第三天。。第四天。。。总而言之为了这句话,
我专门给我带的实习生打了个电话,让他到办公室提醒我,
所以特意标红。。。怎么说也是好几毛钱呢,有木有啊!!!!!!)
4,里面的方法执行顺序和解释
onPreExecute()→doInBackground(Params... params) →onProgressUpdate(Progress[] values)→onPostExecute(Result result)
源码我就不贴了,贴了也没什么意思,你只要能看懂我上面写的那个箭头,
你也就大概了解了这个问题。
其中有几点必须说明:2
1,onPreExecute(),这个方法适合初始化,例如将进度条归零啊,
imageView设置为空之类的出事操作~
2,doInBackground(Params... params) ,这个方法是一定要实现的,
而且这个里面可以执行耗时较长的操作,
最关键的,不可以对UI进行更新,因为该方法是在子线程之中进行,
但是可以调用publishProgress(int number)更新进度条,实际上不是在该线程进行更新,
依然在主线程更新进度条。
3,publishProgress(int number),这个number就是之进度条更新的,
调用publisProgress(int number)之后,
会自动调用onProgressUpdate(Progress[] values)
5,例子下载地址
http://download.csdn.net/detail/zzjjqqzzhhqq/7774541
如果有任何疑问和问题,欢迎各位拍砖,喷神您就放过小弟吧