异步任务
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