从Android ContentProvider中的networking同步时,防止networking同步循环

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

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

具有networking同步标志的notifyChange是客户端应用程序进行修改时所必需的,但在同步适配器正在修改时应该避免。

在contentprovider中,怎样才能轻易地告诉客户端应用程序(在修改时应该触发networking同步)还是由同步适配器(不应触发networking同步)来使用它。

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

Solutions Collecting From Web of "从Android ContentProvider中的networking同步时,防止networking同步循环"

SyncAdapter观看有关REST API使用情况的video 。

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

  1. 标志本身允许SyncAdapter确定需要改变的行以及这些改变是什么。 你如何区分本地创build的行和本地修改的行之间的区别? 另外你怎么知道哪个REST API调用要做? 如果你只是删除一行,你的SyncAdapter知道要删除的行,如果数据现在不见了? 相反,设置“应该删除”标志,然后,当SyncAdapter运行时,它知道将删除推送到服务器。

  2. 这些标志允许你的CursorAdapter修改所创build的视图(比如添加一个Spinner来显示“该行正在被同步”)

  3. 最后,这些他们没有指出,标志让你知道为什么行正在被修改。 如果没有设置任何标志并且该行发生更改,则必须是因为从服务器进行了更新。 因此,不需要同步到networking。

所以,这两个工作stream程如下:

本地更改

  1. 应用程序创build新的行。 行“创build”标志是真实的。
  2. ContentProvider存储行,看到创build标志,所以它调用notifyChange(...,true);
  3. 同步到networking=真(最终参数)导致SyncAdapter触发。
  4. SyncAdapter扫描数据库,find设置了创build标志的行并执行相应的服务器操作。 成功后, SyncAdapter清除该标志( ContentProvivder上的行更新)
  5. ContentProvider看到标志清除,没有标志被设置,所以它调用notifyChange(…,false);
  6. ContentObserver的标志改变,更新看起来像“同步完成”

所有这些步骤对于更新/删除都是等效的 – 对于每个创build/更新/删除,每个可同步行一个标志。 另外注意其他赢 – 如果“创build”暂时失败怎么办? 服务器closures…你怎么知道要重试? – 很简单,你不清除“创build”标志,你会在15分钟后看到它。

远程更改

  1. 由于周期性同步, SyncAdapter触发。
  2. SyncAdapter从服务器获取更新。 将更改推入数据库。 不设置任何标志。 ContentProvider看到缺less标志,知道变化必须来自服务器(或者不是需要推送到服务器的数据库更改),所以它调用notifyChange(...,false);
  3. ContentObserver查看内容更改,并使用新的行数据进行更新