import java.util.ArrayList;

import android.os.AsyncTask;

public class AsyncTaskPool
{

    private int poolSize;
    private ArrayList<AsyncTask> currentTasks = new ArrayList<AsyncTask>();
    private ArrayList<Object> pendingTasks = new ArrayList<Object>();

    /**
     * @param poolSize
     *            : it should be less than 20. As Android only supports max. 20 concurrent Asynch tasks.
     */
    public AsyncTaskPool(int poolSize)
    {
	this.poolSize = poolSize;
    }

    public int getPoolSize()
    {
        return poolSize;
    }


    public boolean addTask(AsyncTask asyncTask, Object... params)
    {

	if (currentTasks.size() < poolSize)
	{
	    currentTasks.add(asyncTask);
	    if (params != null)
		asyncTask.execute(params);
	    else
		asyncTask.execute();
	}
	else
	{
	    Object[] task = new Object[2];
	    task[0] = asyncTask;
	    task[1] = params;
	    
	    pendingTasks.add(task);
	}
	
	return true;
    }
    
    public boolean removeTask(AsyncTask task)
    {
	if(currentTasks.contains(task))
	{
	    currentTasks.remove(task);
	    return true;
	}
	return false;
    }
  
    //Add this method in the onPostExecute method of AsyncTask
    public boolean removeAndExecuteNext(AsyncTask atask)
    {
	removeTask(atask);
	if (pendingTasks.size()>0 && currentTasks.size()<poolSize)
	{
	    Object [] task = (Object []) pendingTasks.get(0);
	    pendingTasks.remove(task);
	    
	    addTask((AsyncTask)task[0], (Object[])task[1]);
	    	    
	}
	
	return false;
    }
    
}
