本文共 851 字,大约阅读时间需要 2 分钟。
如果不需要HTTP调用的响应
CountDownLatch可以帮您解决这个问题.您可以使用count对其进行初始化,然后调用countDown(),该方法在每次HTTP调用之后立即返回.在onPostExecute端,await()会阻塞,直到countDown()被调用计数为止.
所以:
>使用AsyncTask的构造函数中的HTTP调用次数构造CountDownLatch
>在每个HTTP调用之后调用latch.countDown()
>调用onPostExecute的线程将调用latch.await(),它将阻塞直到上述所有线程完成其HTTP调用为止
如果您确实需要回应
上面的方法可以工作(每个countDown()和await()返回之间都有一个事前-事前关系),但是还有另一种方法.
将每个HTTP调用包装在Callable< Response>中,并将其提交给ExecutorService;否则,将其提交给ExecutorService.它会立即给您返回Future< Response> ;,然后您可以将其提供给定义onPostExecute的对象.该方法可以使用Response r = future.get()获取实际响应,该响应将一直阻塞直到该特定可调用对象完成为止.如果对所有HTTP调用都执行此操作,则在为每个期货调用futureWhatever.get()之后,将确保HTTP调用已全部完成.
这种方法的一个优点是,在所有HTTP调用完成之前,onPostExecute不必阻塞.它可以取得进展,直到此时所需的那一步完成为止.例如,如果这样做:
Future callA = httpA.get();
processCallA(callA); // this could take a while
Future callB = httpB.get();
...
…那么只要HTTP调用A已经完成,即使HTTP调用B完成,processCallA也可以执行其操作.
转载地址:https://blog.csdn.net/weixin_33921444/article/details/112956321 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!