Почему ContentResolver.cancelSync () не отменяет процесс синхронизации SyncAdapter? - PullRequest
0 голосов
/ 26 декабря 2018

Как отменить процесс синхронизации 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 Ответ

0 голосов
/ 26 декабря 2018

В документации AbstractThreadedSyncAdapter есть раздел об отмене:

Синхронизация отменяется с помощью Thread.interrupt () в потоке синхронизации.Либо ваш код в onPerformSync (Account, Bundle, String, ContentProviderClient, SyncResult) должен проверить Thread.interrupted (), либо вы должны переопределить один из onSyncCanceled (Thread) / onSyncCanceled () (в зависимости от того, поддерживает ли ваш адаптер синхронизациюнесколько аккаунтов параллельно).Если ваш адаптер не учитывает отмену, выполненную платформой, вы рискуете уничтожить весь процесс вашего приложения.

...