Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.util.concurrent.RejectedExecutionException in Async Task Android

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?

like image 912
Rushabh Patel Avatar asked Dec 26 '22 19:12

Rushabh Patel


1 Answers

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

like image 79
Wroclai Avatar answered Jan 12 '23 05:01

Wroclai