AsyncTask的异常

上一篇博客简单的讲了一下AsyncTask的使用和一些问题点,这篇文章主要谈谈RejectedExecutionException产生的原因及AsyncTask的版本更新

AsyncTask的版本变迁

AsyncTask内部封装了两个线程池(SeriaExcutor和THREAD_POOL_EXCUTOR)和一个Handler(InternalHandler)其中SerialExecutor线程池用于任务的排队,让需要执行的多个耗时任务,按顺序排列,THREAD_POOL_EXECUTOR线程池才真正地执行任务,InternalHandler用于从工作线程切换到主线程.

3.0之前

3.0以前的AsyncTask版本,使用execute(task)的时候是只能5个线程并发的执行的,而且其线程池总数为128 .超过的线程只能等待前面的线程执行完才被调度执行.当一次添加了超过128个任务的时候,就会报RejectedExecutionException.

3.0之后

3.0以后的版本,对AsyncTask进行的改动还是比较大的.主要在下面几个方面:

  • 3.0以后,AsyncTask改为了串行方式,同时只能执行一个任务.
  • 增加了executeOnExecutor(Execute exec) 的方法,如果不想使用默认线程池,可以自己创建一个线程池,灵活配置.

Executor exec = new ThreadPoolExecutor(15, 200, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());  
new DownloadTask().executeOnExecutor(exec);  

这样我们就能使用自定义的Executor来执行任务,而不是SerialExecutor.上面 的例子的效果就是允许15个任务并行,最大存储200个任务.

总结

使用AsyncTask虽然可以以简短的代码实现异步操作,需要让AsyncTask正常工作的话,要注意很多条条框框。推荐的一种进行异步操作的技术就是使用Loaders。这个方法从Android 3.0 开始引入,在android支持包中也有包含。

-------------看啥呢?没了-------------