Dim
Dim

Reputation: 4827

Executing two asynctask in in two different classes

I have 2 AsyncTasks in two different classes but the problem is when the first is do in backgroung state the second is not executed. The first asyncTask if preformed in loop because it needs to update every 5 seconds the new data. If i stop the task (condition = flase) the second one works perfectly.

First class:

public class MapScreen extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map_screen);

        UpdateUserCords updateUC = new UpdateUserCords();
        updateUC.execute();
    }

class UpdateUserCords extends AsyncTask<String, Void, String> 
{


    @Override
    protected String doInBackground(String... params) {


        while(condition)
        {

            //some code in loop...


            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return null;

    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Void... values) {


        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {


        super.onPostExecute(result);
    }
}

}

Second class:

public class Groups extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_groups);


    getGroups getGr = new getGroups();
    getGr.execute(); //not executing, no error or crash


}


class getGroups extends AsyncTask<String, Void, String> 
{


    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

    @Override
    protected String doInBackground(String... params) {
        //some code...
        return null;
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
    }


}
}

Upvotes: 0

Views: 502

Answers (3)

Elad92
Elad92

Reputation: 2491

After Android API 11, AsyncTasks started to run on serial executor by default, that means that only one task is running at a time. To get the behavior of prior to API 11, which is running on ThreadPoolExecutor, you'll need to specify it in the code like this:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
  myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
else {
  myTask.execute();
}

Please take a look here for more information: http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

Good luck!

P.S. It's not recommended to use AsyncTask for an infinite thread, AsyncTask purpose is to do a Task on the background, not to run forever, so if you want an infinite thread, I think you should create it as a Thread and not as an AsyncTask.

Upvotes: 3

Johannes Staehlin
Johannes Staehlin

Reputation: 3720

Both classes extend Activity and only one of them is running at the same time. If you want a task to be execute longer than the lifetime of an activity, you have to wrap it into an Service

Upvotes: -1

Robert Estivill
Robert Estivill

Reputation: 12487

You asynctasks are in two different activities. Only one activity is active at any time.

Upvotes: 0

Related Questions