title: Android:java.util.concurrent.ThreadPoolExecutor
body: <p>In my app there is <code>RecyclerView</code> with tons of images in it.Images are loaded as user scrolls RecyclerView with this code:</p>
  
  <pre><code>    if(Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB)
          loader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,url);
      else
          loader.execute(url);
  </code></pre>
  
  <p>Unfortunately sometimes when user scrolls fast this error occurs:</p>
  
  <pre><code>Task android.os.AsyncTask$3@73f1d84 rejected from 
  java.util.concurrent.ThreadPoolExecutor@8f5f96d[Running, pool size = 9, 
  active threads = 9, queued tasks = 128, completed tasks = 279]
  </code></pre>
  
  <p>Is there way to detect if poolExecutor is full and skip image loading?</p>
  
  <p>Whole Image class:</p>
  
  <pre><code>public class Image extends ImageView {
  private AsyncTask&lt;String,Integer,Bitmap&gt; loader;
  
  public Image(Context context) {
      super(context);
      this.setScaleType(ScaleType.FIT_XY);
  }
  
  public Image(Context context, AttributeSet attrs) {
      super(context, attrs);
      this.setScaleType(ScaleType.FIT_XY);
  }
  
  public void loadURL(String url) {
      if(loader!=null)
          loader.cancel(true);
      loader=new AsyncTask&lt;String, Integer, Bitmap&gt;() {
          @Override
          protected Bitmap doInBackground(String... params) {
              URL url = null;
              byte[] bytes = null;
              HttpURLConnection connection=null;
              try {
                  url = new URL(params[0]);
                  connection=(HttpURLConnection) url.openConnection();
                  connection.setRequestProperty("Connection", "close");
                  connection.setRequestMethod("GET");
                  connection.setUseCaches(true);
                  InputStream is = null;
                  is=connection.getInputStream();
                  bytes = IOUtils.toByteArray(is);
              } catch (MalformedURLException e) {
                  e.printStackTrace();
              } catch (ProtocolException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
              if (connection!=null)
                  connection.disconnect();
              Bitmap res=null;
              if(!isCancelled() &amp;&amp; bytes!=null)
                  res=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
              return res;
          }
          @Override
          protected void onPostExecute(Bitmap res) {
              if(res!=null) {
                  setImageBitmap(res);
                  _animate();
              }
          }
      };
      if (this.getDrawable()!=null) {
          Bitmap bmp=((BitmapDrawable) this.getDrawable()).getBitmap();
          this.setAnimation(null);
          if (bmp!=null) {
              bmp.recycle();
              //Log.d("image","recycled");
          }
          this.setImageBitmap(null);
      }
      /*
      ThreadPoolExecutor e =(ThreadPoolExecutor) Executors.newFixedThreadPool(9);
      Log.d("pool size",e.getActiveCount()+"/"+e.getMaximumPoolSize());
      if (e.getActiveCount() == e.getMaximumPoolSize()) {
      }
      */
      //start loading
      if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB)
          loader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
      else
          loader.execute(url);
  }
  private void _animate() {
      ValueAnimator bgAnim= ValueAnimator.ofObject(new IntEvaluator(),0,255);
      bgAnim.setDuration(500);
      bgAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
          @Override
          public void onAnimationUpdate(ValueAnimator animation) {
              Image.this.getDrawable().setAlpha((int) (animation.getAnimatedValue()));
          }
      });
      bgAnim.start();
  }
  </code></pre>
  
  <p>}</p>