异步任务




1)异步任务是什么,有什么作用?


像Handler消息传递机制类似,android官方提供的专门用于处理耗时超作,并及时更新UI组件的一个抽象类.

常用于耗时操作,如网络操作,数据库操作,等大量的耗时操作.




2)对AsyncTask<Params, Progress, Result>类的理解?

   a.AsyncTask是什么样的类?

 

 AsyncTask是个抽象类,这一属性决定我们运用时要继承该类,并实现该类中的方法.




   b.<>括号中的三个参数的含义?(重点)


         Params: 1.execute(Params...)方法中的参数类型;



               2.doInBackground(Params...)方法中的参数类型.




Progress: 1.publishProgress(Progress...)方法中的参数类型;

                 2.onProgressUpdate(Progress...)方法中的参数类型.



Result: 1.Result doInBackground(Params...)方法中的返回值类型.





   c.参数后...的含义?

       

...为可变参数类型,理解:编译器会将形参转变成一个数组形参,

   这样我们就可以用过params[0],或params[1]等下标方法来获取形参的值.




3)对AsyncTask类中的几个必要方法的理解,要理解方法是由谁执行?什么时候执行的?在哪里执行的?

  将<>中的三个参数与方法联系起来?

下面说的执行次序的前提是下面的所有方法都被调用


序号

方法名

执行者

执行次序

哪里执行

方法说明

1

execute(Params...)

AsyncTask实例

-

主线程

通过创建AsyncTask实例,并调用该方法后,就会启动异步任务

2

onPreExecute()

系统调用

1

主线程

用于完成一些初始化的准备工作

3

Result doInBackground(Params...)

系统调用

2

后台线程

用于完成耗时工作

4

publishProgress(Progress...)

系统调用

3

 在doInBackground方法中调用

用于通知主线程更新任务的进度

5

onProgressUpdate(Progress...)

系统调用

4

主线程

用于更新任务的进度,(publishProgress方法调用后会触发该方法的调用)

6

onPostExecute(Result)

系统调用

5

主线程

用于处理结果

4)如何使用AsyncTask类?(结合多线程的使用来思考)



1.继承AsyncTask抽象类,实现自定义的异步任务.


2.自定必要的参数类型,重写需要的方法.


3.在主线程创建AsyncTask的实例,并调用execute()方法就OK了!




5)高级部分

关于AsyncTask异步任务并发执行问题?



在android3.0后,异步任务改变为顺序执行,即如果连续两次或多次调用异步任务时(new AsyncTask().execute()),

系统会按照执行顺序一个一个地执行异步任务,而不会并发地执行它们.



怎样才能使其并发地执行?

在android3.0后,增加了一个方法:

executeOnExecutor(Executor exec, Params... params)

我们可以使用该方法,将第一个参数设置为并发执行,那么异步任务改变为并发执行.



对于第一个参数Executor exec的理解;

该参数要求传入一个线程池对象,即传入一个(Executors.newCachedThreadPool())线程池对象,

或者使用android官方提供的线程池对象,android官方对于第一个参数提供了两个对象供我们使用,分别为:

AsyncTask.THREAD_POOL_EXECUTOR 如果使用其设置第一个参数,异步任务就会改变为并发执行.

AsyncTask.SERIAL_EXECUTOR