如何实现Activity和Service之间的通信

7

我有以下情况:

我有一个服务定期检查互联网上是否有新数据,

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

用户可能希望立即更新...

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

问题在于:

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

目前,我使用Messenger从服务向活动发送消息,告知请求的结果,或者如果我没有收到消息,在x秒后通知用户请求失败。

  1. 请您能否提出不同的方法?
  2. 我不想等待消息,如果x秒后未收到消息,则通知用户,有更好的方法吗?

但这可能需要一些时间,可能会失败,甚至可能永远无法返回...这些都是常见情况,对吧?如果网络不稳定或服务器因某种原因响应延迟,客户端必须处理并相应地通知用户。如果我误解了您的问题,请纠正我。 - cgr
你正在使用SyncAdapter吗? - Lucas Crawford
@LucasCrawford 不,Lucas。 - Lisa Anne
你应该使用SyncAdapter进行自动更新,因为它优化了网络使用,使Android无线电以最佳方式在电池使用上工作。从您已经描述的设置方式来看,这是一个相当简单的升级,并将改善您的应用程序。至于您的问题,我认为您无法再做更多了。数据库要么返回数据,要么不返回数据,根据您处理查询时间的方式,您只能告诉用户请求失败了。最佳实践是针对所有特定情况(网络、服务器、输入)都有适当的消息。 - Lucas Crawford
你可以显示一个通知。 - JiTHiN
@LucasCrawford 一个用于读取数据的SyncAdapter? - Lisa Anne
3个回答

3

您已经掌握了基础知识,因此没有太多其他建议。我只会向您展示一些替代方案:

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

2
您可以考虑使用“乐观渲染”/“乐观更新”——这是一种模式,即在客户端上更新 UI,就好像它已经在服务器上成功一样。一旦您从服务器收到响应,您可以相应地更新 UI。您可以参考新设计的应用程序,如谷歌通话
有关更多信息,请参阅以下讨论: 我认为使用这种方法将使您的应用程序具有更好的可用性。
目前的实现看起来还不错。不过,你可以通过观看这个讲座来改进它-https://www.youtube.com/watch?v=BlkJzgjzL0c

1
如果你把这看作是一个模型视图控制器问题,那么问题在于缺乏代表服务状态的模型。当服务执行刷新时,这个“状态”需要反映在你的用户界面中。因此,服务需要记录这个状态,并让用户界面可以访问它。
一种选择是使用共享内存,例如单例对象或静态成员变量(不建议使用)。另一种选择是将该状态保留在数据库中。
另一个问题是在状态更改时通知用户界面。如其他帖子所述,有多种方法可以实现这一点,例如本地广播、消息总线(如Otto)、ContentObservers等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接