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

这里的场景:

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

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

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

【问题讨论】:

    标签: android asynchronous service


    【解决方案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 进行计划更新而不是服务。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多