java.util.concurrent.RejectedExecutionException in Async Task Android

android, android-asynctask, listview, multithreading

Solution

`AsyncTask` threads are placed in a work queue. That work queue restricts how many threads you can instantiate. When you exceed the maximum it will give you a `RejectedExecutionException`.

The solution is to refactor your code to not instantiate threads in `getView()` or have a check that controls if a thread for the current row already has started. `getView()` gets called very frequently and therefore you will eventually exceed the number of allowed threads if you're not checking if a thread is currently running on a row.

DOWNLOAD LINK: https://www.dropbox.com/s/pvr9zyl811tfeem/ListViewImageCache.zip

Problem

``` public View getView(final int position, View convertView, ViewGroup parent) { SectionHolder sectionHolder = null; ViewHolder holder = null; convertView = listAdapter.getView(getIndexForPosition(position), convertView, parent); convertView.setTag(contactsIds[getIndexForPosition(position)]); holder = new ViewHolder(); holder.txtTitle = (TextView) convertView .findViewById(R.id.list_item_title); holder.id = contactsIds[getIndexForPosition(position)]; new ThumbnailTask(holder,contactsIds[getIndexForPosition(position)]).execute(); return convertView; } private class ThumbnailTask extends AsyncTask<Void, Void, Integer> { private String mId; private ViewHolder mHolder; public ThumbnailTask(ViewHolder holder, String id) { mId = id; mHolder = holder; } @Override protected Integer doInBackground(Void... params) { // TODO Auto-generated method stub int drawableId = getContactStatus(mHolder.id); // Log.i("DRAWABLE",drawableId+""); return drawableId; } protected void onPostExecute(Integer drawableId) { if (mHolder.id.equals(mId)) { if (drawableId != 0) { if (UpdateStatusService.user == 1) { mHolder.txtTitle.setCompoundDrawablesWithIntrinsicBounds(0, 0,drawableId, 0); } else { mHolder.txtTitle.setCompoundDrawablesWithIntrinsicBounds(0, 0,R.drawable.ic_action_quetion, 0); } } else { mHolder.txtTitle.setCompoundDrawablesWithIntrinsicBounds(0,0, android.R.color.transparent, 0); } } } } static class ViewHolder { public TextView txtTitle; public String id; } ``` This is my code of adapter to getView of the listview. ListView Contains the list of contacts from the android. but i am getting the java.util.concurrent.RejectedExecutionException Async task basically get the image from the server and if any number matches to the server data that will contain one image to set otherwise not. So what should i do to avoid this exception?

Original source