我有一个带有SyncAdapter
的Android应用,该应用大多数。用户可以更改他们想要查看的数据集,这需要重新同步。用户还可以在应用程序处于同步过程中更改数据集,如果用户启动同步,更改数据集,然后同步完成,则会导致竞争状况,这会导致他们查看错误的数据。
要解决此问题,当用户更改数据集时,我想取消任何现有的同步,然后触发所选数据集的新同步。我是这样做的:
public class MainActivity extends Activity {
... // Some members omitted for clarity
// Called whenever the user changes the data set
private void onDataSetChanged() {
final Account account = getSelectedAccount();
final boolean isSyncActive = ContentResolver.isSyncActive(account, AUTHORITY);
// Cancel sync for the old data set
Log.e(TAG, "onDataSetChanged: " + account.name + " - " + isSyncActive);
if (isSyncActive) {
ContentResolver.cancelSync(account, AUTHORITY);
}
// Request a sync for the new data set
ContentResolver.requestSync(account, AUTHORITY, new Bundle());
}
}
在其他地方我定义了SyncAdapter
:
public class SyncAdapter extends AbstractThreadedSyncAdapter {
... // Some members omitted for clarity
@Override
public synchronized void onPerformSync(final Account account, final Bundle extras,
final String authority, final ContentProviderClient provider, final SyncResult syncResult) {
Log.e(TAG, "onPerformSync: " + account.name);
... // Sync logic
}
}
SyncAdapter
似乎设置正确,因为通常成功调用,并显示#onPerformSync()
日志语句。只有在ContentResolver.cancelSync()
之前立即调用ContentResolver.requestSync()
时,有时(并非总是)失败。在这些情况下,SyncAdapter#onPerformSync()
永远不会被调用,并且不会显示其日志语句。
我尝试在extras捆绑包上设置ContentResolver.SYNC_EXTRAS_EXPEDITED
和ContentResolver.SYNC_EXTRAS_MANUAL
为true
,但这没有效果。我还通过自己的日志记录验证了account
和AUTHORITY
是否正确。我在成功同步时也会看到onPerformSync: ...
日志,因此我知道我并没有像使用SyncAdapters
的人一样误用Logcat。
我知道请求同步是一个非常复杂的过程,但至少有一些方法让我知道为什么同步被拒绝了?其他日志似乎并不能说明为什么它决定忽略我的请求。