根据帐户设置调用的顺序未调用 SyncAdapter
Posted
技术标签:
【中文标题】根据帐户设置调用的顺序未调用 SyncAdapter【英文标题】:SyncAdapter not being called depending on order of Account setup calls 【发布时间】:2011-12-17 01:39:58 【问题描述】:我的 SyncAdapter 遇到了一些奇怪的行为。
我第一次安装我的应用程序时(使用 adb 卸载后),它会启动并创建一个帐户。根据某些语句的顺序(见下文),我的 SyncAdapter 的 onPerformSync() 将永远不会被调用;我的“帐户和同步”下的帐户显示“同步进行中”图标无限旋转。如果我随后取消选中我的应用帐户旁边的同步复选框,然后重新选中它,我的 onPerformSync() 会立即被调用。
这会导致我的 SyncAdapter 永远不会被调用。 “同步进行中”图标永远旋转,除非我取消选中,然后重新选中同步复选框:
final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
通过相同语句的这种排序,一切正常:
final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
mAccountManager.addAccountExplicitly(account, mPassword, null);
我的猜测是我将 SyncManager 置于某种不一致的状态,因为它会在创建帐户时立即触发同步请求,并且我正在更改它的配置。但是(几乎连贯的)文档没有提到任何时候调用这些函数的问题。
顺便说一句,我发现contentResolver.requestSync()
永远不会触发您的SyncAdapter.onPerformSync()
,除非您致电ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
。
有人可以解释这种行为吗?至少可以说有关帐户和同步的文档有些不清楚。
我在 2.1 模拟器上遇到这种行为,针对 2.1 SDK 进行编译。
【问题讨论】:
+1!我们花了好几个小时才看到这个并调用 setIsSyncable!谢谢! 信息量很大。请写下您自己问题的答案,以便我们知道它不再在“未回答”列表中。 我已经更新了我的问题,因此问题部分更加清晰。我希望有人解释或详细说明为什么会发生这种行为。 @JarrodSmith 请回答您的问题并将其标记为已回答。 【参考方案1】:我发现contentResolver.requestSync()
永远不会触发您的 SyncAdapter.onPerformSync(),除非您调用 ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
。
有关我使用 SyncAdapter 的解决方案的详细说明,请在此处查看我的答案:
https://***.com/a/12015967/988870
【讨论】:
我也遇到了同样的问题,谢谢解答。【参考方案2】:我只是用头撞墙好几个小时,试图弄清楚为什么定期同步不起作用。事实证明,轮询频率需要以秒(字面量)为单位而不是毫秒,而不是以毫秒为单位的秒。因此,例如,如果您希望它每分半钟同步一次,您需要调用:
ContentResolver.addPeriodicSync(
account,
authority,
Bundle.EMPTY,
90
);
另外,传入的包不能像文档中那样为空,它会抛出 NullPointerException。
【讨论】:
以上是关于根据帐户设置调用的顺序未调用 SyncAdapter的主要内容,如果未能解决你的问题,请参考以下文章
StoreKit 框架 - 更改 iTunes 商店以进行应用内购买时未调用回调