根据帐户设置调用的顺序未调用 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的主要内容,如果未能解决你的问题,请参考以下文章

未调用 PayPal 沙盒订阅返回 url

StoreKit 框架 - 更改 iTunes 商店以进行应用内购买时未调用回调

Firebase 查询未按调用顺序触发

未调用 FaceDetectionListener onFaceDetection

wcf 调用完成事件未按正确顺序触发

错误:passport.initialize() 中间件未使用 以啥顺序进行调用?