Android ContentResolver.requestSync()在取消后不会立即触发SyncAdapter

时间:2017-07-12 19:13:10

标签: android android-syncadapter

我有一个带有SyncAdapter的Android应用,该应用大多数。用户可以更改他们想要查看的数据集,这需要重新同步。用户还可以在应用程序处于同步过程中更改数据集,如果用户启动同步,更改数据集,然后同步完成,则会导致竞争状况,这会导致他们查看错误的数据。

要解决此问题,当用户更改数据集时,我想取消任何现有的同步,然后触发所选数据集的新同步。我是这样做的:

public class MainActivity extends Activity {
    ... // Some members omitted for clarity

    // Called whenever the user changes the data set
    private void onDataSetChanged() {
        final Account account = getSelectedAccount();
        final boolean isSyncActive = ContentResolver.isSyncActive(account, AUTHORITY);

        // Cancel sync for the old data set
        Log.e(TAG, "onDataSetChanged: " + account.name + " - " + isSyncActive);
        if (isSyncActive) {
            ContentResolver.cancelSync(account, AUTHORITY);
        }

        // Request a sync for the new data set
        ContentResolver.requestSync(account, AUTHORITY, new Bundle());
    }
}

在其他地方我定义了SyncAdapter

public class SyncAdapter extends AbstractThreadedSyncAdapter {
    ... // Some members omitted for clarity

    @Override
    public synchronized void onPerformSync(final Account account, final Bundle extras,
            final String authority, final ContentProviderClient provider, final SyncResult syncResult) {
       Log.e(TAG, "onPerformSync: " + account.name);

       ... // Sync logic
   }
}

SyncAdapter似乎设置正确,因为通常成功调用,并显示#onPerformSync()日志语句。只有在ContentResolver.cancelSync()之前立即调用ContentResolver.requestSync()时,有时(并非总是)失败。在这些情况下,SyncAdapter#onPerformSync()永远不会被调用,并且不会显示其日志语句。

我尝试在extras捆绑包上设置ContentResolver.SYNC_EXTRAS_EXPEDITEDContentResolver.SYNC_EXTRAS_MANUALtrue,但这没有效果。我还通过自己的日志记录验证了accountAUTHORITY是否正确。我在成功同步时也会看到onPerformSync: ...日志,因此我知道我并没有像使用SyncAdapters的人一样误用Logcat。

我知道请求同步是一个非常复杂的过程,但至少有一些方法让我知道为什么同步被拒绝了?其他日志似乎并不能说明为什么它决定忽略我的请求。

0 个答案:

没有答案