6

私は2つの非同期タスクを両方とも別々のネットワーク操作を実行しています.1つの非同期タスクが他のタスクが単一の変数に対して終了するのを待ちたい.他のタスクを最初のタスクが完了するのを待つようにする...効率的に達成するものはありますか ここに画像の説明を入力

4

3 に答える 3

5

thisを参照すると、 .execute() so; は使用できません。

まず、次のようにタスクを開始する必要があります。

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

次に、静的変数を作成して、両方のタスクがそれにアクセスできるようにします。

public static boolean task1Finished = false;

次に、タスクの簡単な例:

最初のタスク

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;
    }
}

2 番目のタスク

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)");
    }
}
于 2013-05-31T08:05:20.420 に答える
0

もう一方を同期的に呼び出す必要がある場合は、最初の OnpostExecute で別の非同期を作成する必要があります。

于 2013-05-31T07:41:31.973 に答える