同步适配器在连接恢复后仅运行一次



我正在尝试实现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 个用户,服务器将被分配 ;|)

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

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

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

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

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

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

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

最新更新