BitmapLoader icon indicating copy to clipboard operation
BitmapLoader copied to clipboard

出现RejectedExecutionException

Open yinglovezhuzhu opened this issue 10 years ago • 1 comments

在列表中加载图片,快速滑动的时候出现RejectedExecutionException

yinglovezhuzhu avatar Sep 05 '14 10:09 yinglovezhuzhu

  • 问题原因:
    这个异常的原因是AsyncTask的问题,研究AsyncTask(源码)的眼吗就会发现,其实AsyncTask是被限制在一个线程里的,无论你启动多少个AsynTask,都是在一个队列里面进行等待(源码),有这么一行代码private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10)这也解释了为什么同一个AsynTask对象是无法两次excute了。Google进行了多次修改,经过源码分析和验证发现从1.6开始到3.0之前的系统版本当等待队列中的AsyncTask等待队列超过128个的时候,就会抛出RejectedExecutionException的异常,在这中间的办恩使用了线程池,允许运行多任务同时进行。而到了3.0之后,又被限制在一个线程里为了避免多线程执行的错误。
  • 解决办法
    既然是AsyncTask的问题,可以从AsyncTask入手,自己重写一个AnsyTask相同功能的类,把启动的任务限制在一个线程里避免多线程执行的错误。本作者在网上找到一个已经写好的类AsyncTaskEx,修改在特定的版本调用这个自定义的异步线程类。

yinglovezhuzhu avatar Sep 05 '14 10:09 yinglovezhuzhu