Почему 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() (в зависимости от того, поддерживает ли ваш адаптер синхронизацию несколько аккаунтов параллельно). Если ваш адаптер не учитывает отмену, выданную платформой, вы рискуете уничтожить весь процесс вашего приложения.

Другие вопросы по тегам