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

java-在AsyncTask中同步两个并发网络调用,第1张

概述我正在尝试进行多个并发的HTTPGET调用,这些调用可能会在不同的时间后返回响应.一旦有了数据,就可以使用它为ListView创建自定义适配器.由于NullPointerException的风险很高,因此在尝试创建Adapter之前,我需要确保所有数据都在那里.HTTP调用当前是通过AsyncTask完成的,这对于在后

我正在尝试进行多个并发的http GET调用,这些调用可能会在不同的时间后返回响应.
一旦有了数据,就可以使用它为ListVIEw创建自定义适配器.由于NullPointerException的风险很高,因此在尝试创建Adapter之前,我需要确保所有数据都在那里.
http调用当前是通过AsyncTask完成的,这对于在后台执行它们以及稍后调用UI线程以更新视图非常方便.但是它们不是并发的-每个调用都在前一个调用完成之后执行.

我一直在努力,要确保在创建适配器之前所有http调用都返回了响应,同时仍保持并发性.

有没有一种方法可以运行多个并发的网络调用,并在所有并发的http调用完成之后让onPostExecute方法完成任务?

还是我需要使用更复杂的线程,锁等?

解决方法:

如果不需要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&gt ;,然后您可以将其提供给定义onPostExecute的对象.该方法可以使用Response r = future.get()获取实际响应,该响应将一直阻塞直到该特定可调用对象完成为止.如果对所有http调用都执行此 *** 作,则在为每个期货调用futureWhatever.get()之后,将确保http调用已全部完成.这种方法的一个优点是,在所有http调用完成之前,onPostExecute不必阻塞.它可以取得进展,直到此时所需的那一步完成为止.例如,如果这样做:

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

…那么只要http调用A已经完成,即使http调用B完成,processCallA也可以执行其 *** 作.

总结

以上是内存溢出为你收集整理的java-在AsyncTask中同步两个并发网络调用全部内容,希望文章能够帮你解决java-在AsyncTask中同步两个并发网络调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1087898.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存