【问题标题】:Sync Adapter run only once after connection restored连接恢复后同步适配器只运行一次
【发布时间】:2018-03-09 16:44:49
【问题描述】:

我正在尝试实现SyncAdapter,它几乎可以正常工作,就像我想要的那样。 唯一的问题是当用户离线并调用周期性同步(例如:10次)时,当用户恢复互联网连接时,同步适配器调用将重复10次:

按下按钮时我如何称呼它:

val bundle = Bundle()
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
bundle.putString(SYNC_TRIGGER_SOURCE, SyncManager.FROM_SYNC_CLICK);
ContentResolver.requestSync(account, AUTHORITY_PONTOTEL, bundle);

如果用户将连接更改为离线,单击按钮 293879878923792387 次,当他将连接恢复为在线时,它将调用服务器 293879878923792387 (x 50000 个用户,服务器将被 ddos​​ed ;|)

有没有办法在不锁定按钮的情况下避免这种情况?

有没有办法清除同步队列并只保留最后一个?

【问题讨论】:

    标签: android android-syncadapter


    【解决方案1】:

    有没有办法清除同步队列并只保留最后一个?

    实际上,这应该是默认行为。如果您使用相同的参数和相同的帐户请求同步,它将在对新请求进行排队之前取消任何先前排队的同步,或者如果已经运行具有相同参数的同步,则根本不将其排队。 (如果你想自己看看,你可以查看SyncManager的源代码,他们会比较key和bundle来删除重复项)

    也就是说,我建议您确保验证您请求同步的方式和位置。如果您使用相同的帐户并将相同的参数添加到您的 Bundle,那么它应该只运行 one 同步,忽略具有相同负载的进一步请求。

    可能是SYNC_EXTRAS_EXPEDITED 以某种方式覆盖了上述行为,所以我会尝试在没有标志的情况下运行您的代码,看看是否可以修复它,尽管我在 SDK 中没有看到任何迹象26个源代码。

    作为最后的手段,您可以使用cancelSync 取消帐户的所有同步,但我认为这没有必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多