gpt4 book ai didi

java - 在 AsyncTask 中同步两个并发网络调用

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:29 25 4
gpt4 key购买 nike

我正在尝试进行多个并发 HTTP GET 调用,这些调用可能会在不同时间后返回响应。
获得数据后,我将使用它为 ListView 创建自定义适配器。由于存在 NullPointerException 的高风险,在尝试创建适配器之前,我需要确保所有数据都存在。
HTTP 调用目前使用 AsyncTask 完成,这对于在后台执行它们以及稍后调用 UI 线程来更新 View 很方便。但它们不是并发的 - 每个调用都在前一个调用完成后执行。

我正在努力解决的问题是,在创建适配器之前确保所有 HTTP 调用都已返回响应,同时仍保持并发性。

有没有办法运行多个并发网络调用,并让 onPostExecute 方法在所有并发 HTTP 调用完成后执行它的操作?

或者我是否需要使用更复杂的线程、锁等?

最佳答案

如果您不需要 HTTP 调用的响应

A CountDownLatch 可能会为你做的伎俩。你用一个计数初始化它,然后调用 countDown() ,在每次 HTTP 调用后立即返回。关于onPostExecute边,await() block 直到 countDown()已被调用count次。

所以:

  • 构建CountDownLatchAsyncTask 中的 HTTP 调用次数的构造函数
  • 调用latch.countDown()在每次 HTTP 调用之后
  • 线程调用onPostExecute调用 latch.await() ,这将阻塞,直到上述所有线程都完成了它们的 HTTP 调用

如果您确实需要回复

以上方法可行(每个 countDown()await() 返回之间存在先行关系),但还有另一种方法。

将每个 HTTP 调用包装在 Callable<Response> 中,并将其提交给 ExecutorService ;它会立即给你一个 Future<Response> ,然后您可以将其提供给定义 onPostExecute 的对象.该方法可以通过 Response r = future.get() 获得实际响应,它将阻塞直到特定的可调用函数完成。如果您对所有 HTTP 调用都这样做,那么在您调用 futureWhatever.get() 之后对于这些 future 中的每一个,您将确保 HTTP 调用都已完成。

此方法的一个优点是 onPostExecute在所有 HTTP 调用完成之前不必阻塞;它可以取得进展,直到它当时需要的那个完成为止。例如,如果确实如此:

Future callA = httpA.get();
processCallA(callA); // this could take a while
Future callB = httpB.get();
...

... 然后 processCallA即使 HTTP 调用 B 正在完成,只要 HTTP 调用 A 已经完成,就可以执行它的操作。

关于java - 在 AsyncTask 中同步两个并发网络调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com