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

 
    
    - 75
- 1
- 6
- 
                    1your thought was correct. have your tried that.? – Sagar Maiyad May 31 '13 at 07:24
- 
                    Now my implementation is like that only but...i have to postponed a big task for single variable – paul May 31 '13 at 07:56
- 
                    take a look at the picture i meant that way – paul May 31 '13 at 08:01
3 Answers
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)");
    }
}
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
 
    
    - 1,362
- 13
- 31
You need to create another async in OnpostExecute of first one if you need to call the other synchronously.
 
    
    - 118
- 11
 
    