在Android中,我经常需要从多个使用异步回调模式的服务中获得结果,我想知道是否有比我正在做的更好的方法来处理这个模式。
现在,我处理它的方式是这样的:我调用两个服务并将回调传递给它们。在服务A的回调中,我检查并查看服务B是否有缓存的结果。如果有,那么我就做我需要做的任何事情。如果没有,则缓存服务A的结果。我在对服务B的回调中也是这样做的。
例如,我有一个在地图上显示用户当前位置的活动。映射异步加载并调用onMapReady。对位置服务的请求将调用回onConnected。在onMapReady中,我检查是否有位置服务。如果我这样做了,我将地图上的位置设置为用户的最后一个位置。如果没有,则将该位置设置为默认位置并缓存映射。在onConnected中,我检查并查看是否有地图。如果我这样做了,我将地图上的位置设置为用户的最后一个位置。如果我不知道,我会把最后一个位置藏起来。
当只涉及两个服务时,这种模式工作得很好,但我可以设想可能有三个或更多服务的场景,这似乎很笨拙。还有别的办法让我来处理吗?
发布于 2017-01-08 20:38:09
您的异步承诺/任务/任何库都应该有一个函数来为您处理这个问题。C#有Task.WhenAll,在JS中有jQuery.when和类似的朋友。如果你没有这个功能,找一个新的。
发布于 2017-03-09 22:18:37
免责声明:我不是Android开发人员。
我会让回调将它们的结果发送到队列中,然后从队列中读取,直到有足够的结果到达(有可选的超时)。
但是,在相同的队列中发送不同类型的结果并不方便。如果可能,(稍微)不同的结果类可能实现公共接口。对于完全不同的结果,我可以使用多个队列,然后依次从它们中读取。
如果我所关心的是等待所有的结果到达,然后继续,这就足够了。
如果有一个合理的序列,我可以以某种方式开始处理一个结果,甚至在另一个结果到达之前,我可以命令队列中的读取来反映这一点:
// 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的语言。
发布于 2016-12-09 19:37:54
有时,我会使用一个计数,设置为我知道我将要等待的物品的数量。然后打各种有延迟回叫的电话。在每个回调中,我从回调的特定args中捕获所需的内容,然后调用一个公共例程。
普通例程减少计数,如果计数为非零,则返回,而不做任何进一步操作。当计数达到零时,它将运行一些依赖于已完成的所有回调的代码。
(这可以使用对象或闭包来完成。)
有时,当我知道简单计数时,它在本地是显而易见的;其他时候,我会动态地增加计数,例如当我需要等待回调发生时,然后该回调可能需要发出另一个涉及另一个回调的调用,这取决于前一个回调的答案。
我正在使用Chrome,它喜欢这些延迟回调,并希望有相当数量的机制来协调各种回调。
https://softwareengineering.stackexchange.com/questions/337846
复制相似问题