如何实现通信Activity-Service

时间:2015-12-02 19:05:00

标签: java android

我有以下情况:

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

  • 当有新数据可用时,会将其下载并保存在sqlite上。
  • 当保存到db完成时,服务会广播一个intent,以便活动知道从db中提取新数据。

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

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

以下是问题:

通知用户请求正在进行,但可能需要一段时间,可能会失败,永远不会返回...

目前我收到一条消息(使用Messenger)从服务返回到活动通知请求的结果,或者,如果我没有收到消息,则在x秒内我通知用户请求不成功。< / p>

  1. 请问您能提出一个不同的方法吗?
  2. 我不想等 对于消息,如果在x秒后没有收到通知 用户,还有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

你已经掌握了基础知识,所以没有其他建议。我将向您展示一些替代方案:

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

答案 1 :(得分:2)

您可以考虑 乐观呈现 / 乐观更新 - 在客户端更新用户界面的模式好像它在服务器上成功了。 一旦您从服务器获得响应,您就会相应地更新UI。您可以使用google hangouts.等新设计来引用应用程序

有关详细信息,请参阅此讨论:

我想使用这种方法可以为您的应用提供更好的可用性。

目前的实施看起来不错。但是,您可以通过以下讲话来改进它 - https://www.youtube.com/watch?v=BlkJzgjzL0c

答案 2 :(得分:1)

如果您将此视为模型视图控制器问题,则此处的问题是缺少表示服务状态的模型。当服务正在执行刷新时,这个&#34;状态&#34;需要反映在您的UI中。因此,服务需要在UI可以访问的位置记录此内容。

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

另一个问题是在此状态发生变化时通知用户界面。正如其他帖子所提到的,有多种方法可以做到这一点,例如LocalBroadcast,像Otto这样的消息总线,ContentObservers等。