设计用于在Android中同步数据


23

我已经看到在大多数应用程序上,用于在服务器和客户端之间同步数据的两种实现。假设未设置GCM:-

  1. 定期运行意向服务,该意向服务从网络下载数据并存储在数据库中。
  2. 实现一个定期运行的同步适配器。

您建议在应用程序中包含以上哪一项?为什么?

Answers:


12

注意:同步适配器异步运行,因此您应该在期望它们有规律且有效地而不是瞬时传输数据的情况下使用它们。如果需要进行实时数据传输,则应在AsyncTask或IntentService中进行。-

基本上,如果您需要实时传输,请使用IntentService(第一个选项),否则使用SyncAdapter。我更喜欢IntentService,因为它感觉更可自定义,但是更简单的方法是使用SyncAdapter。


18

在很大程度上取决于您需要哪种同步。

定期的

如果您的应用程序是新闻应用程序,并且每天在特定时间发布帖子(例如每天7.45 AM),那么您在后台服务(例如,早上8点)中运行定期任务。

例如:滴水。他们每天(约6.30 PM)通知我一次。我相信他们使用定期任务。

事件触发

如果您的数据传输是由用户操作触发的,则使用后台服务或AsyncTask进行数据传输。

例如:DropBox / Evernote。当我与应用互动时,它们会同步。

瞬间

如果您的应用程序运行即时消息传递/邮件/非周期性重要更新,则您需要推送通知,因为您想立即提醒用户。在这种情况下,请使用GCM或Parse。例如:WhatsApp / Google聊天。既然您明确提到了您不想使用GCM,我将告诉您为什么应该使用标准的推送通知提供程序,而不是编写自己的推送通知提供程序:

推送通知可立即工作-延迟很少(几秒钟,很少是几分钟)。如果您要实现自己的解决方案/库来执行此操作-在幼稚的模型中,则应每隔一秒钟或5秒或一分钟ping服务器一次,以检查状态。这非常低效,因为它会消耗CPU(并因此消耗电池),移动设备上的带宽以及服务器上的负载。但是,在GCM / Parse中,它们始终使服务器保持端口开放(请参见此处)。这是标准且最有效的方法。另外,如果10个应用程序使用GCM,则不需要10个打开的连接,而每个设备仅需要一个。而且,除非您有充分的理由/资金/时间这样做,否则您真的不想开发自己的解决方案。

关于Sync Adapter的注释:Sync Adapter在以上三种情况下均能很好地工作。选中“ 运行同步适配器”,您将看到它取决于GCM还是您自己的机制(事件触发或自定义解决方案)或网络可用性(事件触发)或周期性事件。总而言之,这是一个非常方便的类,用于同步数据,而不必每次都进行一长串的初始化或在一个地方实现上述所有情况。


作为一个扩展的问题,如果我需要更新比赛的实时比分,即时情景是否适合这种情况?我有一个包含比赛详细信息的屏幕,并且当用户在该屏幕上时,乐谱应该自动更新,而无需同步或手动更新。那么gcm会是正确的一步吗?
gaara87

@AkashRamani我看不出您不应该在这种情况下使用GCM / Parse的原因。但是,GCM是免费的,而Parse会向您收取一定的费用。如果您的更新在4096字节以内,则可以直接发送更新。如果您的分数更新非常频繁,那么轮询可能是一个不错的主意,而不是GCM(例如,板球分数)。我建议测试/配置轮询和GCM的延迟和CPU /电池消耗。
森迪普•

AWS还具有跨平台和跨市场的通知解决方案。请参阅:docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin 2014年

3

SyncAdapter其他答案未提及a的一个方面。

SyncAdapter模式要求您具有要同步的特定ContentProvider权限以及要同步的特定帐户类型(请参阅Authenticator)。因此,除非您的体系结构中已有这些组件(例如,因为您授予其他应用程序对数据的访问权限或需要支持帐户),SyncAdapter否则将导致大量的实施开销。


2

当涉及与连接有关的数据同步时,您还希望能够扩展。我相信推荐的解决方法是使用同步适配器。

如果您查看Android转换指南:创建同步适配器,似乎也是如此。

应用程序中的同步适配器组件封装了用于在设备和服务器之间传输数据的任务的代码。根据您在应用中提供的计划和触发器,同步适配器框架将在同步适配器组件中运行代码...


2

除非您需要实时数据,否则应使用同步适配器,因为,它会根据各种条件自动执行数据传输,例如数据更改,经过的时间,一天中的时间等。它集中所有数据传输,因此您的数据传输将与从其他应用程序传输数据,从而减少了电池消耗。

对于瞬时任务,我们可以使用,

持续时间较短的任务的AsyncTask可能为3-4秒。

IntentService用于长时间运行的任务。


经验法则的重大故障。
Brill Pappin 2014年

0

因为我们在谈论设计,所以我们应该提到管理SyncAdapter,SyncResult对象以及之后发生的事情。

我实际上使用SyncAdapter告诉我的库对服务器进行IntentService Web调用。管理此“同步”操作非常棘手。

我现在采用的一种方法是完全放弃SyncResult对象,而仅使用服务记录每个“同步”结果

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.