【发布时间】: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 请回答您的问题并将其标记为已回答。