我有两个asyc任务都执行单独的网络操作。我想要一个异步任务等待其他任务完成单个变量..我想这样做就像执行其他asyc操作onPostexecute第一个但是单个变量我必须做其他任务等待第一个完成...是否有任何实现有效
答案 0 :(得分:4)
参考this,你不能使用.execute();
首先,你必须像这样开始你的任务:
// 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;
}
}
第二项任务
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)");
}
}
答案 1 :(得分:4)
也许asynctask不是最好的工具? android api中有一些有趣的类可以帮助完成特定的同步工作:
来自android developper的引用:“四个类帮助常见的专用同步习语。
Semaphore是一种经典的并发工具。
CountDownLatch是一个非常简单但非常常见的实用程序,用于阻塞,直到给定数量的信号,事件或条件成立。
所以我建议调查一下:
循环障碍 http://developer.android.com/reference/java/util/concurrent/CyclicBarrier.html
器 http://developer.android.com/reference/java/util/concurrent/Exchanger.html
答案 2 :(得分:0)
如果需要同步调用另一个,则需要在第一个的OnpostExecute中创建另一个异步。