Android_Question icon indicating copy to clipboard operation
Android_Question copied to clipboard

AsyncTask的原理以及弊端?AsyncTask为什么要求在主线程加载,对象为什么要在主线程创建?

Open whatshappen opened this issue 5 years ago • 0 comments

  • AsyncTask内部封装了两个线程池和一个Handler。两个线程池作用分别是:用于任务队列的线程池和用于执行的线程池。执行线程池的核心线程数是2-4之间,也取决于cpu核数,最大线程数是2*cup核数,线程队列定义的是128。而Handler的作用主要是进行线程间通信。 一个AsyncTask对象只能被执行一次,也就是只能调用一次execute,否则会抛异常。 而AsyncTask的任务队列通过synchronized关键字实现的是串行执行。而且由于AsyncTask内部线程池定义成了静态变量,所以整个进程的所有asyncTask全部都在这个串行线程池中排队执行,而且执行都使用同一个线程池,因此,在任务量较多时,效率不高,不建议使用。

  • AsyncTask中的Handler是静态全局变量,而且还在handleMessage方法中获取了主线程的Looper为了能够进行线程间切换,所以就要求Handler对象在主线程中创建,execute方法必须在主线程执行。由于静态成员变量,会随着类的加载而加载,因此就需要AsyncTask在主线程中加载。(Android4.1及以上已有系统完成主线程加载,是在ActivityThread的main方法中调用了AsyncTask的init方法,就满足了类在主线程中加载。)

whatshappen avatar Apr 03 '19 13:04 whatshappen