如何在多个网络呼叫全部完成后触发事件

时间:2016-12-08 01:43:59

标签: android future

我继承了遗留代码。我面临的问题是在Android中以异步方式在启动画面上发生多个网络调用(但根据我的问题可能是任何系统)。所有调用完成后,我需要加载另一个屏幕(Android中的Activity)。现在,正在发生的事情是没有办法知道哪个呼叫首先完成,并且有很多布尔值等用于跟踪所有作业何时完成。我需要你对我可以使用的模式或工具的推荐,只有在所有工作完成后才能进入下一个屏幕。团队没有时间学习RxJava。在RxJava之前是如何完成的?

所以要清楚我现在有3个网络呼叫同时启动但异步启动,我只想在它们全部完成时才前进到下一个窗口。请记住,它们都是在同一时间开始,但可以在不同时间完成,因为它们是异步的。

我需要像promise这样的东西,但我认为Java没有。{我可以使用future来执行此操作吗?怎么样?

更新:问题是我在执行此异步工作的android活动中。活动是主线程上的用户面向。

对于那些建议倒计时的人,我有一个想法反对它。在android中,开发人员无法让主线程阻塞。将出现ANR错误。所以假设我创建了两个网络调用线程,然后从主线程调用_latch.await();。现在android将继续等待两个调用完成。很长一段时间不允许在android主线程上阻塞。

2 个答案:

答案 0 :(得分:0)

结帐CountDownLatch https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

这个想法是你创建一个实例CountDownLatch(5);指定一个数字。 然后你调用await()方法,它将阻塞,直到countDown()被调用5次。

答案 1 :(得分:0)

如果您知道在开始时要启动的总呼叫数,那么@Karlo推荐的countDownLatch应该可以正常工作。

但是,如果在其他调用已经运行时可以创建新调用,则尝试使用信号量。 https://developer.android.com/reference/java/util/concurrent/Semaphore.html

基本上,你创造了' n'信号量池,在开始呼叫时调用acquire(),在结束呼叫时调用release()。

发布后,请检查availablePermits()。如果结果是' n',则表示所有呼叫都已结束。