Почему ContentResolver.cancelSync() не отменяет процесс синхронизации SyncAdapter?
Как отменить процесс синхронизации SyncAdapter? ContentResolver.cancelSync() не отменяет его.
Мне это нужно, потому что я синхронизирую тысячу контактов (в onPerformSync()) из приложения в книгу контактов Android (вызывая ContentResolver.requestSync()). И мне нужно отменить текущую синхронизацию, когда я хочу выполнить новую.
Чтобы еще раз проверить, что ContentResolver.cancelSync () не отменяет синхронизацию, я скачал BasicSyncAdapter. Заменено onPerformSync () на
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
for (int i = 0; i < 20; i ++) {
if (i == 10) {
ContentResolver.cancelSync(GenericAccountService.GetAccount(ACCOUNT_TYPE), FeedContract.CONTENT_AUTHORITY);
}
Log.i(TAG, "count " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Таким образом, после 10 он должен остановиться, но он регистрирует все 20.
Спасибо!
1 ответ
Документация AbstractThreadedSyncAdapter
есть раздел об отмене:
Синхронизация отменяется путем выдачи Thread.interrupt() в потоке синхронизации. Либо ваш код в onPerformSync(Account, Bundle, String, ContentProviderClient, SyncResult) должен проверить Thread.interrupted(), либо вы должны переопределить один из onSyncCanceled(Thread)/onSyncCanceled() (в зависимости от того, поддерживает ли ваш адаптер синхронизацию несколько аккаунтов параллельно). Если ваш адаптер не учитывает отмену, выданную платформой, вы рискуете уничтожить весь процесс вашего приложения.