首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步异步任务的结果

同步异步任务的结果
EN

Software Engineering用户
提问于 2016-12-09 15:16:55
回答 3查看 126关注 0票数 2

在Android中,我经常需要从多个使用异步回调模式的服务中获得结果,我想知道是否有比我正在做的更好的方法来处理这个模式。

现在,我处理它的方式是这样的:我调用两个服务并将回调传递给它们。在服务A的回调中,我检查并查看服务B是否有缓存的结果。如果有,那么我就做我需要做的任何事情。如果没有,则缓存服务A的结果。我在对服务B的回调中也是这样做的。

例如,我有一个在地图上显示用户当前位置的活动。映射异步加载并调用onMapReady。对位置服务的请求将调用回onConnected。在onMapReady中,我检查是否有位置服务。如果我这样做了,我将地图上的位置设置为用户的最后一个位置。如果没有,则将该位置设置为默认位置并缓存映射。在onConnected中,我检查并查看是否有地图。如果我这样做了,我将地图上的位置设置为用户的最后一个位置。如果我不知道,我会把最后一个位置藏起来。

当只涉及两个服务时,这种模式工作得很好,但我可以设想可能有三个或更多服务的场景,这似乎很笨拙。还有别的办法让我来处理吗?

EN

回答 3

Software Engineering用户

发布于 2017-01-08 20:38:09

您的异步承诺/任务/任何库都应该有一个函数来为您处理这个问题。C#有Task.WhenAll,在JS中有jQuery.when和类似的朋友。如果你没有这个功能,找一个新的。

票数 1
EN

Software Engineering用户

发布于 2017-03-09 22:18:37

免责声明:我不是Android开发人员。

我会让回调将它们的结果发送到队列中,然后从队列中读取,直到有足够的结果到达(有可选的超时)。

但是,在相同的队列中发送不同类型的结果并不方便。如果可能,(稍微)不同的结果类可能实现公共接口。对于完全不同的结果,我可以使用多个队列,然后依次从它们中读取。

如果我所关心的是等待所有的结果到达,然后继续,这就足够了。

如果有一个合理的序列,我可以以某种方式开始处理一个结果,甚至在另一个结果到达之前,我可以命令队列中的读取来反映这一点:

代码语言:javascript
复制
// Imagine we're trying to help user see if a bus is coming.
// APIs are imaginary throughout.
// We wrap callback-accepting services so that the callbacks
// simply put the result into the queue given.
connection_service.askForConnection(connection_queue);
location_service.askForLocation(location_queue);
// Start using the location, connection may be arriving.
location = location_queue.get();
BusStop the_stop = determineBusStop(location);  // from offline data.
connection = connection_queue.get();
StopInfo info = BusStop.getApproachingBuses(connection);

对于您的特殊情况,地理地图和位置,您的方法,与缓存的位置和地图瓷砖,看起来最方便用户:总是有一些东西显示用户,即使它不是最新的。

不幸的是,你的服务似乎没有使用FutureTasks的语言。

票数 0
EN

Software Engineering用户

发布于 2016-12-09 19:37:54

有时,我会使用一个计数,设置为我知道我将要等待的物品的数量。然后打各种有延迟回叫的电话。在每个回调中,我从回调的特定args中捕获所需的内容,然后调用一个公共例程。

普通例程减少计数,如果计数为非零,则返回,而不做任何进一步操作。当计数达到零时,它将运行一些依赖于已完成的所有回调的代码。

(这可以使用对象或闭包来完成。)

有时,当我知道简单计数时,它在本地是显而易见的;其他时候,我会动态地增加计数,例如当我需要等待回调发生时,然后该回调可能需要发出另一个涉及另一个回调的调用,这取决于前一个回调的答案。

我正在使用Chrome,它喜欢这些延迟回调,并希望有相当数量的机制来协调各种回调。

票数 -1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/337846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档