为什么ContentResolver.cancelSync()不取消SyncAdapter同步过程?

时间:2018-12-26 16:24:28

标签: android android-contentresolver android-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 个答案:

答案 0 :(得分:2)

AbstractThreadedSyncAdapter的文档中有一节有关取消:

  

通过在同步线程上发出Thread.interrupt()来取消同步。您在onPerformSync(Account,Bundle,String,ContentProviderClient,SyncResult)中的代码必须检查Thread.interrupted(),或者您必须重写onSyncCanceled(Thread)/ onSyncCanceled()中的一个(取决于适配器是否支持同步)。多个帐户)。如果您的适配器不遵守框架发出的取消操作,则可能会导致应用程序的整个过程被杀死。