16

我的 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 置于某种不一致的状态,因为它会在创建帐户时立即触发同步请求,并且我正在更改它的配置。但是(几乎连贯的)文档没有提到在您喜欢时调用这些函数的任何问题。

作为其他与 SyncAdapters 苦苦挣扎的人,我发现除非你contentResolver.requestSync()调用.SyncAdapter.onPerformSync()ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);

有人可以解释这种行为吗?至少可以说,围绕帐户和同步的文档有些不清楚。

我在 2.1 模拟器上遇到这种行为,针对 2.1 SDK 进行编译。

4

2 回答 2

7

我发现它contentResolver.requestSync()永远不会触发你的 SyncAdapter.onPerformSync() 除非你调用ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);.

有关我使用 SyncAdapter 的解决方案的详细说明,请在此处查看我的答案:

https://stackoverflow.com/a/12015967/988870

于 2012-12-13T01:42:29.863 回答
4

我只是把头撞在墙上好几个小时,试图弄清楚为什么定期同步不起作用。事实证明,轮询频率需要以秒(字面意思)而不是毫秒为单位,也不是以毫秒为单位的秒数。因此,例如,如果您希望它每分半钟同步一次,您需要调用:

            ContentResolver.addPeriodicSync(
                    account,
                    authority,
                    Bundle.EMPTY,
                    90
            );

此外,传入的包不能像文档中那样为空,它会抛出 NullPointerException。

于 2014-07-25T16:09:41.093 回答