1

我正在寻找在服务和 2 个不同客户端(应用程序和小部件)之间共享数据的最佳方法。目前,我的应用程序启动一个线程,该线程每 15 秒左右在后台下载大量数据,将它们填充到对象图中,然后由主应用程序在可配置的时间间隔内使用。这适用于主要应用程序,但对于我想要开发的小部件来说还不够,因为对象图将超出进程(并且该方法有点混乱 IMO)。

所以我希望将数据检索部分提取到服务中(或者如果有更好的建议,还有其他的)。我的问题是,从该服务接收到的数据与客户沟通的最佳方式是什么?或者你不会使用服务而是使用其他东西?

由于客户端的开销,我希望服务在数据准备好时通知客户端,而不是客户端不断轮询服务......如果可能的话......当然。

我已经看过广播意图(应用程序和小部件都会接收),但我认为我必须序列化整个对象图,然后在客户端中对其进行膨胀才能做到这一点。那是对的吗?我担心我可以完成重新充气客户端的速度。

有没有更好的方法将数据发送回客户?如果可能的话,我更愿意运送对象而不是序列化......但如果这是最好的方式,那么我会这样做。

任何帮助是极大的赞赏!

4

1 回答 1

1

我想我必须序列化整个对象图,然后在客户端膨胀它才能做到这一点

在附加组件上传递大量数据Intent并对其进行序列化/反序列化确实不是一个好方法。

由于客户端的开销,我希望服务在数据准备好时通知客户端,而不是客户端不断轮询服务

由于负责管理您的小部件的类扩展了AppWidgetProvider,因此它会自动扩展BroadcastReceiver,因此您可以随时直接向它发送一些广播,以防您不知道。

有没有更好的方法将数据发送回客户?

正确的方法是向客户端发送广播,表明新数据可用,但不将数据本身传递给意图。相反 - 当负责网络的线程响应解析它(可能从您的描述中从您的服务启动)时,将数据存储在 SQLite 数据库中(带有或不带有 a ContentProvider)。然后它发送所有客户端将接收并从数据库中获取数据的广播。

我强烈建议您观看此视频,解释如何实现 REST 服务器客户端和数据消耗的最佳方法。

目前,我的应用程序启动了一个线程,该线程每 15 秒左右在后台下载大量数据

这根本不是一个好主意。你的用户的电池很快就会耗尽,当用户意识到你的应用耗尽了他们的电池并消耗了所有的 3G/4G 带宽时,你会得到非常糟糕的评价。
而不是拉,你应该使用GCM 技术。主要思想是当新数据可用时通知的责任从客户端传递到服务器端,您不必一直拉来检查是否有更新。

于 2013-08-18T06:58:36.563 回答