【问题标题】:How to implement communication Activity-Service如何实现通信Activity-Service
【发布时间】:2016-03-07 04:13:18
【问题描述】:

我有以下情况:

我有一项服务会定期检查互联网上的新数据,

  • 当有新数据可用时,它们会被下载并保存在 sqlite 上。
  • 当保存到数据库完成后,服务会广播一个意图,以便活动知道从数据库中提取新数据。

用户可能想要请求立即更新...

...在这种情况下,我使用 Messenger 请求服务查找新数据

问题出在这里:

通知用户请求正在进行,但可能需要一段时间,可能不成功,永远无法返回...

目前,我从 Service 向 Activity 返回一条消息(使用 Messenger),通知请求的结果,或者,如果我没有收到消息,我会在 x 秒内通知用户请求不成功。

  1. 请问您能建议一种不同的方法吗?
  2. 我不喜欢等待 对于一条消息,如果在 x 秒后没有收到任何消息,请通知 用户,有没有更好的方法?

【问题讨论】:

  • “但可能需要一段时间,可能不成功,永远不会回来......”这些都是常见的风景吧?如果网络低或者服务器由于某种原因响应延迟,客户端必须相应地处理并通知用户。如果我误解了您的问题,请纠正我。
  • 你在使用 SyncAdapter 吗??
  • @LucasCrawford nope Lucas
  • 您应该真正使用 SyncAdapter 进行自动更新,因为它优化了网络使用,以便 Android 收音机在电池使用方面以最佳方式工作。从您已经描述的设置方式开始,这是一个非常简单的升级,并改进了您的应用程序。关于您的问题,我认为您无能为力。数据库要么返回数据,要么不返回数据,并且取决于您如何处理查询时间,您可以为用户做的就是告诉他们请求失败。最佳做法是针对所有特定情况(网络、服务器、输入)提供适当的消息
  • 您可以显示通知。

标签: java android


【解决方案1】:

你已经掌握了基础知识,所以没有什么可推荐的了。我将向您展示一些替代方案:

  • 您可以使用ContentObserver 并在数据库中有新数据时更新 UI(无需等待来自服务的消息)。
  • 如果您在 Service UI 组件之间有大量通信,那么查看OttoEventBus 或仅围绕Observables / RxJava 重构您的代码可能会更容易。
  • 您可以将超时逻辑移动到服务中(这样会更容易,因为所有错误处理都在一个地方),然后将错误消息返回给 UI。大多数网络框架允许您设置连接超时参数,并且在达到此时间后请求失败。如果您还没有看过网络框架 - Retrofit + OkHttp 是一个很好的起点。

【讨论】:

    【解决方案2】:

    您可以考虑乐观渲染/乐观更新- 一种更新客户端 UI 的模式好像它已经在服务器上成功了。 一旦您从服务器获得响应,您就会相应地更新 UI。您可以参考具有新设计的应用程序,例如 google hangouts.

    有关更多信息,请参阅此讨论:

    我想使用这种方法会给您的应用带来更好的可用性。

    当前的实现看起来不错。但是你可以通过这个话题来改进它-https://www.youtube.com/watch?v=BlkJzgjzL0c

    【讨论】:

      【解决方案3】:

      如果您将此视为模型视图控制器问题,这里的问题是缺少表示服务状态的模型。当服务执行刷新时,这个“状态”需要反映在你的 UI 中。因此,Service 需要将其记录在 UI 可以访问的位置。

      一个选项只是一块共享内存,例如单例对象甚至静态成员变量(不推荐)。另一种选择是将该状态保留在您的数据库中。

      另一个问题是在此状态更改时通知 UI。正如其他帖子所提到的,有多种方法可以做到这一点,例如 LocalBroadcast、Otto 等消息总线、ContentObservers 等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 1970-01-01
        相关资源
        最近更新 更多