【问题标题】:Prevent network sync loop when syncing from network in Android ContentProvider在 Android ContentProvider 中从网络同步时防止网络同步循环
【发布时间】:2011-07-05 20:56:56
【问题描述】:

我正在编写自己的 ContentProvider,它将使用 SyncAdapter 同步到 Web 服务。

当同步适配器修改内容提供者的数据时会发生问题,提供者在内部调用 getContentResolver().notifyChange 时触发网络同步导致同步循环。

当客户端应用程序进行修改时需要带有网络同步标志的 notifyChange,但在同步适配器正在修改时应避免使用。

如何在 contentprovider 中轻松判断它是由客户端应用程序(应在修改时触发网络同步)还是由同步适配器(不应触发网络同步)使用。

目前我正在使用不同的 CONTENT_URI(同步适配器使用 CONTENT_URI_NO_SYNC 访问数据,客户端应用程序使用 CONTENT_URI)能够区分这两种访问类型并相应地设置网络同步标志。

【问题讨论】:

    标签: java android android-contentprovider android-syncadapter


    【解决方案1】:

    观看this videoSyncAdapters 中有关 REST API 的使用情况。

    他们讨论的方法是将一组元数据标志列添加到数据库中。这允许我们做 3 件事。

    1. 标志本身允许SyncAdapter 确定需要更改的行以及这些更改是什么。您如何区分本地创建的行和本地修改的行?此外,您如何知道要进行哪个 REST API 调用?如果您只是删除一行,那么如果数据现在已经消失,您的SyncAdapter 怎么知道要删除的行?相反,设置“应该删除”标志,然后,当SyncAdapter 运行时,它知道将删除推送到服务器。

    2. 这些标志允许您的 CursorAdapter 修改创建的视图(例如添加 Spinner 以显示“正在同步该行”)

    3. 最后,他们没有指出这一点,标志让您知道为什么要修改该行。如果没有设置任何标志并且行发生更改,一定是因为来自服务器的更新。因此,无需同步到网络。

    所以,两个工作流程如下:

    局部变化

    1. 应用程序创建新行。行“创建”标志为真。
    2. ContentProvider 存储行,看到创建标志,因此它调用notifyChange(...,true);
    3. Sync to network = true(最后一个参数)导致SyncAdapter 触发。
    4. SyncAdapter 扫描数据库,找到设置了创建标志的行并执行适当的服务器操作。成功后,SyncAdapter 清除标志。(ContentProvivder 上的行更新)
    5. ContentProvider 看到标志清除,没有设置标志,所以它调用 notifyChange(...,false);
    6. ContentObservers 看到标志变化,更新为“同步完成”

    所有这些步骤都等同于更新/删除——每个可同步行的每个创建/更新/删除都有一个标志。 还要注意另一个胜利——如果“创建”暂时失败怎么办?服务器宕机...你怎么知道重试? -- 很简单,你不清除“创建”标志,15 分钟后你就会看到它。

    远程更改

    1. SyncAdapter 由于定期同步而触发。
    2. SyncAdapter 从服务器获取更新。将更改推送到数据库中。不设置任何标志。 ContentProvider 看到缺少标志,知道更改必须来自服务器(或者不是需要推送到服务器的数据库更改),所以它调用 notifyChange(...,false);
    3. ContentObservers 看到内容发生了变化,因此他们更新了新的行数据

    【讨论】:

    • +1 关于 Google I/O 演讲的 cmets 有很多,但倾向于使用选项 C 的人并不多。感谢您清晰地总结。
    • 根据标志设置 syncToNetwork 对我来说是缺少的链接。很好的解决方案!
    • 嗨@jcwenger,我有一个问题要问,如果同步是在数据更改事件上触发,事件是否在数据更改时触发,或者当数据更改并且只有网络之后才会触发同步?
    • 需要注意的是我遇到的一个问题。当同步适配器从本地更改触发时,同步适配器还将扫描远程更改。有没有办法在调用 notifyChange(...,true) 时设置同步标志?
    猜你喜欢
    • 2015-06-15
    • 2017-06-02
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多