Android异步服务调用策略

Posted

技术标签:

【中文标题】Android异步服务调用策略【英文标题】:Android asynchronous service calls strategy 【发布时间】:2010-12-02 08:32:03 【问题描述】:

这里的场景:

    客户端远程调用服务(返回无效)并提供 回调对象 服务在后台线程上执行一些长时间运行的逻辑 然后使用回调对象触发以太成功或失败 其中(因为这些操纵视觉元素)在执行 Activity#runOnUiThread 块

场景运行良好。问题是 - 我可以使用 AsyncTask 来制作 代码不那么冗长(如何?),这样做会有什么好处 那样吗?

或者我应该一起摆脱客户端回调吗? 执行经过改造的远程服务调用,以在其中返回一些值 AsyncTask#doInBackground?

【问题讨论】:

【参考方案1】:

很难说AsyncTask 是否会让事情变得不那么冗长,因为我们不知道您当前实现的冗长程度。

对我来说,AsyncTask 意味着我不必担心自己清理线程(例如,将某种终止作业发布到 LinkedBlockingQueue 我的后台线程正在等待)。它还消除了我为与LinkedBlockingQueues 一起使用而创建的自定义Job 类。而且,它简化了在 UI 线程上做最后的工作。

在您的情况下,使用远程服务,UI 线程问题不太重要,因为活动需要自己处理。

我看不出您的#2 和最后一段之间有什么区别。在这两种情况下,您的服务都将调用回调对象,该对象将使用 runOnUiThread() 之类的东西来安排在 UI 线程上完成的工作。

AFAIK,让服务执行任何类型的异步工作的唯一两种方法是通过广播Intent 或回调对象让客户端知道工作已完成。广播Intents 方便但公开(即其他代码可以监视它们)。

我怀疑我在这里可能没有提供太多帮助,但我对您的场景了解得不够多,无法提供更多细节。

【讨论】:

场景不是很原始。我有一个从远程位置查询一些 XML 的服务。当活动通过提供 URL 请求 XML 时,它会立即获得缓存副本或进入等待模式并等待服务完成/失败。当我注意到您在 EndlessAdapter 中使用 AsyncTask 时,我很高兴使用回调、基本线程和 runOnUiThread 对其进行编码。如果我错过了一些更简单的方法来做我正在做的事情,这让我很好奇。顺便说一句 - 谢谢你的回答,和往常一样棒!【参考方案2】:

我有完全相同的问题:我正在开发一个具有“延迟加载”功能的地图活动(来自网络的 xml,对其进行解析,然后使用从该解析创建的“项目”更新我的地图。 ..)

我想知道实现它的“最佳”方式是什么...

从线程启动的异步服务,通过 Intent 的更新通知? 只是一个线程(没有服务,因为我不需要将它暴露给其他应用程序)带回调 带有回调的异步任务 我正在使用 android SDK 性能分析工具 traceview 在速度方面进行比较

我想可能会从 Android-developper-group 上的 Android 贡献者那里找到更准确的答案...

【讨论】:

我认为 Mark 最近总是建议使用 AlertManager 进行计划更新而不是服务。

以上是关于Android异步服务调用策略的主要内容,如果未能解决你的问题,请参考以下文章

WCF服务需要调用异步

如何异步调用我的 WCF 服务?

Spring Boot 微服务异步调用 @EnableAsync @Async

Dubbo3高级特性「框架与服务」框架与服务的异步调用实践以及开发模式

服务消费端泛化调用与异步调用

如何简单粗暴的搞定dubbo调用模块