【问题标题】:Why ContentResolver.cancelSync() doesn't cancel SyncAdapter syncing process?为什么 ContentResolver.cancelSync() 不取消 SyncAdapter 同步过程?
【发布时间】:2018-12-27 17:09:15
【问题描述】:

如何取消 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。

谢谢!

【问题讨论】:

    标签: android android-contentresolver android-syncadapter


    【解决方案1】:

    AbstractThreadedSyncAdapter 的文档中有一个关于取消的部分:

    通过在同步线程上发出 Thread.interrupt() 来取消同步。您在 onPerformSync(Account, Bundle, String, ContentProviderClient, SyncResult) 中的代码必须检查 Thread.interrupted(),或者您必须覆盖 onSyncCanceled(Thread)/onSyncCanceled() 之一(取决于您的适配器是否支持同步多个帐户并行)。如果您的适配器不遵守框架发出的取消操作,您将面临应用整个进程被终止的风险。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      相关资源
      最近更新 更多