我遇到了 SyncAdapter 的问题,我不知道如何解决。
我正在使用定期同步。onPerformSync 方法只是记录一些信息让我知道该过程正在运行(没有调用内容提供程序中的 notifyChanges 或其他任何内容)。
该项目由两个应用程序组成:第一个应用程序创建一个用户帐户(仅用于测试目的)。第二个持有同步适配器。请注意,这对于项目范围是完全合法的。
我首先使用该帐户安装应用程序。我可以看到该帐户已创建。
然后我使用同步适配器安装应用程序,第一次运行同步时挂起。看到帐户同步设置,微调器图标持续运行并且没有记录任何日志消息(意味着它没有达到 onPerformSync)。
但是,我可以在“设置”中取消同步,然后同步过程开始正常工作。这意味着 Account、Content Provider 和 SyncService 之间的连接设置正确。
我知道添加/删除帐户会触发其他同步过程,因此在使用同步适配器安装应用程序之前,我需要等待一段时间。
关于为什么会发生这种情况的任何提示?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAccountManager = AccountManager.get(this);
// No worries here. The account exists and it's the one I want
Account[] accounts = mAccountManager.getAccountsByType(Constants.ACCOUNT_TYPE);
// Just first account for TESTING purposes
if (accounts != null && accounts.length > 0)
account = accounts[0];
else {
Log.e(TAG, "No accounts set!!");
return;
}
// Set sync for this account.
Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
ContentResolver.setIsSyncable(account, authority, 1); // Mandatory since 3.1
// Allows the provider to sync when internet connection is back
ContentResolver.setSyncAutomatically(account, authority, true);
// Add a periodic synchronization
ContentResolver.addPeriodicSync(account, authority, extras, POLL_FREQUENCY);
}
编辑
我发现在同步上调用取消,使它工作。不是最好的解决方案,但它现在解决了问题。我把这条线与“isFirstUse”标志结合起来。
ContentResolver.cancelSync(account, authority);