paul
paul

Reputation: 75

Android async task to wait for other task to complete

I have two asyc task both perform separate network operation.I want one async task to wait for other task to finish for a single variable..I thought of doing it like perform other asyc operation onPostexecute of first one but for a single variable i have to make other task to wait first one to finish...is there any to achieve efficently enter image description here

Upvotes: 6

Views: 6733

Answers (3)

Gomoku7
Gomoku7

Reputation: 1372

Maybe asynctask is not the best tool? There are some interesting classes in the android api that can help doing specifically the synchronizing job :

Quote from android developper : "Four classes aid common special-purpose synchronization idioms.

  • Semaphore is a classic concurrency tool.

  • CountDownLatch is a very simple yet very common utility for blocking until a given number of signals, events, or conditions hold.

  • A CyclicBarrier is a resettable multiway synchronization point useful in some styles of parallel programming.
  • An Exchanger allows two threads to exchange objects at a rendezvous point, and is useful in several pipeline designs."

So I suggest looking into :

Cyclic Barrier http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html

Exchanger http://developer.android.com/reference/java/util/concurrent/Exchanger.html

Upvotes: 4

vilpe89
vilpe89

Reputation: 4702

Referring to this, you can not use .execute() so;

First you have to start your tasks like this:

// Start first task
new Task1().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "");
// Start second task
new Task2().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "");

and then you can make a static variable so the both of tasks can access to it:

public static boolean task1Finished = false;

Then simple example of the tasks:

First task

private class Task1 extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        Log.d("myApp", "Task1 started");

        for(int x = 0; x < 10; ++x)
        {
            try 
            {
                Thread.sleep(1000);
                //Log.d("myApp", "sleeped 1000 ms");
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
        }
        return "";
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onPostExecute(String result) {
        // Lets the second task to know that first has finished
        task1Finished = true;
    }
}

Second task

private class Task2 extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        Log.d("myApp", "Task2 started");
        while( task1Finished == false )
        {
            try 
            {
                Log.d("myApp", "Waiting for Task1");
                Thread.sleep(1000);
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
        }

        Log.d("myApp", "Task1 finished");
        // Do what ever you like
        // ...
        return "";
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onPostExecute(String result) {
        Log.d("myApp", "All done here (Task2)");
    }
}

Upvotes: 5

newBie
newBie

Reputation: 118

You need to create another async in OnpostExecute of first one if you need to call the other synchronously.

Upvotes: 0

Related Questions