Nixo Home

[Untitled Post]

字数统计: 635阅读时长: 2 min
2019/07/25 Share

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。
CATALOG
  1. 1. title WebView面试详解
  • 介绍
    1. 1. 内部代码介绍
    2. 2. 使用注意
  • 源码分析
    1. 1. 工作流程
    2. 2. WeakerRunnable
    3. 3. FutureTask