title WebView面试详解
介绍
AsyncTask内部是由handler+线程池实现的
##优点
- 由于AsyncTask内部提供了线程池,就会对我们的线程有一个很好地管理和控制,也能减少对于反复创建销毁线程的不必要的开销
内部代码介绍
- asyncTask是个抽象类,需要子类继承
- onPreExecute() - 主线程执行的,是在任务执行前运行的可以做一些数据初始化操作
- doInBackground() - 子线程运行的,可以进行耗时操作
- onProgressUpdata() -主线程运行,在publishProgress()调用之后执行更新进度
- onPostExecute() - 主线程执行,任务执行完成后调用
使用注意
- AsyncTask实例必须在主线程创建
- AsyncTask的Eexecute()方法必须在主线程调用
- 内部回调方法Android会自动执行,不需要手动回调
- 一个AsyncTask只能调用一次execute()方法,不然会抛出异常
源码分析
##线程池
- 线程池线程数量是由CPU核心数量+1得到的,例如4核CPU就开5个线程
- 最大线程池数量是由cpu核心数量x2+1得到的 如上4核x2+1 = 9
##SerialExecutor
是用来存放Runnable对象的通过ArrayDeque来存放runable
它内部实现了一个execute方法,将runnable通过arraydeque的offer方法来添加到队尾实现run方法的内明内部以及调用scheduleNext方法来轮询下一个runnable传递给线程池
工作流程
使用SerialExecutor来将runnable发送给线程池进行一个耗时任务的操作,AsyncTask默认是串行状态,它会经历三种Status枚举的状态,PENDDING , RUNNING,FINISHED,最后通过线程池的execute传入FutureTask执行任务
WeakerRunnable
- 它内部是继承了Callable接口,Callable接口与Runnable接口很类似,不同的地方是Runnable没有返回值,而Callable是有返回值的,返回了泛型V对象
FutureTask
内部实现了Callable和Runnable接口
- 构造函数,构造函数实现了传入的callable
- get()方法,是通过阻塞式等待Callabe的返回值
- done()方法,是callable回调结束后自己实现的方法
##postResult()
在doInBackGround执行完成之后,AsyncTask内部会调用postResult来执行完成任务的处理
- 内部调用了Hanlder去发送消息,在handleMessage中做相应的判断,调用AysncTask的finish传入回调返回的结果,在finish内部去判断任务是取消了,还是执行完毕了,如果是取消,就会执行相应的onCanced方法,如果是完毕了就会调用onPostExecute方法,最后将Status状态改为FINISHED。