0

我有一个后台线程调用3个asynctasks同时执行任务。调用线程充当3组这些任务的队列。保持调用线程,直到多个asynctask完成

所以基本上我需要同时调用3个asynctasks,一旦他们完成,我想调用队列中的下三个任务并重复。

但是,我暂停了调用者线程,直到三个asynctask完成。结果,在前三个任务完成之前,队列中的下三个任务开始运行。

因此,无论如何要保持呼叫者的线程,直到asynctasks完成。我知道你可以在asynctask中使用.get(),但它不会使三个asynctasks同时运行。

+0

也许,可以向监听器传递给你的3 asyntask并调用你的听众的方法在你3的AsyncTask的onPostExecute,当3的AsyncTask必须调用此方法,你可以启动你3下的AsyncTask来完成。而且我认为你应该使用一个服务而不是一个线程来发起你的asynctask。希望有所帮助。 – Illuyankas

+0

我正在使用循环来排队任务,并且我无法找到一种方法让它暂停调用下一个任务。 –

+0

如果我很好,Looper不会停下来。如果我不得不这样做,我通过服务获得你的任务列表(可以动态设置),并在同一时间启动3个任务,然后当他们完成重新启动startComand时,你有任务在队列或类似的东西。 – Illuyankas

回答

0

异步任务意味着做事异步....所以这不能以直接的方式来完成...

即使你能做到这一点,它基本上是失败的整点异步操作。

您应该寻找一个同步网络操作。

退房凌空 ...这是一个谷歌图书馆的网络运营特制的,它支持同步操作

http://www.truiton.com/2015/02/android-volley-making-synchronous-request/

有许多其他的图书馆... 改造是一个其他好的图书馆..

+0

我没有在任务中进行网络操作。 –

+0

也我需要异步功能,但一次只有三个 –

1

下面的代码是相当的想法的伪代码。基本上,你会声明一个接口来检查接下来的三个AsyncTasks。您还需要维护一个计数器,以查看从AsyncTask收到的响应数是否乘以3.如果是,则可以触发接下来的三个AsyncTasks。

public interface OnRunNextThree{ 
    void runNextThreeTasks(); 
} 

public class MainClass extends Activity implements OnRunNextThree { 

    private int asyncTasksCounter = 0; 

    public void onCreate() { 
     //Initiate and run first three of your DownloadFilesTask AsyncTasks 

     // ... 
    } 

    public void runNextThreeTasks() { 
     if (asyncTasksCounter % 3 == 0) { 
      // you can execute next three of your DownloadFilesTask AsyncTasks now 

      // ... 
     } else { 
      // Otherwise, since we have got response from one of our previously 
      // initiated AsyncTasks so let's update the counter value by one. 
      asyncTasksCounter++; 
     } 
    } 

    private class DownloadFilesTask extends AsyncTask<Void, Void, Void> { 

     private OnRunNextThree onRunNextThree; 

     public DownloadFilesTask(OnRunNextThree onRunNextThree) { 
      this.onRunNextThree = onRunNextThree; 
     } 


     protected Void doInBackground(Void... voids) { 
      // Do whatever you need to do in background 
      return null; 
     } 

     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      //Got the result. Great! Now trigger the interface. 
      this.onRunNextThree.runNextThreeTasks(); 
     } 
    } 

} 
+0

@Sankha Palihawadana如果它满足您的要求,请将答案标记为已接受。 – fluffyBatman

相关问题