由于AsyncTask内部是使用线程池(ThreadPoolExecutor)来管理要处理的任务的,所以AsyncTask的弊端就非常明确了:要extcute的任务数量超过线程池最大容量时,必然会报错,导致FC。还有重要的一点就是,假如你需要立即执行一个网络请求获取数据,执行asynctask.execute()时,asynctask的doInBackground可能无法马上执行。原因是因为用线程池管理,而线程池有一定数量的核心线程(android2.3之前是5,android2.3之后是1),这些线程是可以马上运行的。还有一定数量的线程放在缓冲队列里,等有核心线程执行完毕之后再执行这些线程(到目前为止的版本,缓冲队列能放10个线程),然后有最大线程数量设定(128个)。打个比方,现在线程池中已经有128个线程等待处理,然后又execute进一个线程,这时候就会报错。再比如线程池已经有5个线程了(2.3之前),你再execute进一个,必然会等待有个核心线程处理完毕之后才会处理你新execute进的线程。
所以,在使用asynctask的时候,一定要优化自己的代码,不要执行过多的异步任务。如果想要立即执行某个线程,可以new一个线程池,传递给executeOnExecutor(Executor exec, Params...params)。如:executeOnExecutor(Executors.newCachedThreadPool(),null); 可以自定义线程池的核心线程数量,缓存线程数量以及最大线程数量来处理。 还可以用Thread+Handler+message来处理。