Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ContentResolver.requestSync()并不总是在取消SyncAdapter后立即触发它_Android_Android Syncadapter - Fatal编程技术网

Android ContentResolver.requestSync()并不总是在取消SyncAdapter后立即触发它

Android ContentResolver.requestSync()并不总是在取消SyncAdapter后立即触发它,android,android-syncadapter,Android,Android Syncadapter,我有一个Android应用程序,带有SyncAdapter,大部分时间都能正常工作。用户可以更改他们想要查看的数据集,这需要重新同步。用户还可以在应用程序处于同步过程中更改数据集,如果用户开始同步、更改数据集,然后同步完成,导致他们查看错误的数据,则可能会导致竞争条件 要解决此问题,当用户更改数据集时,我希望取消任何现有同步,然后为所选数据集触发新同步。我是这样做的: public class MainActivity extends Activity { ... // Some mem

我有一个Android应用程序,带有
SyncAdapter
,大部分时间都能正常工作。用户可以更改他们想要查看的数据集,这需要重新同步。用户还可以在应用程序处于同步过程中更改数据集,如果用户开始同步、更改数据集,然后同步完成,导致他们查看错误的数据,则可能会导致竞争条件

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

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()
log语句。只有在紧接
ContentResolver.requestSync()
之前调用
ContentResolver.cancelSync()
时,它有时(并非总是)会失败。在这些情况下,永远不会调用
SyncAdapter#onPerformSync()
,也不会显示其日志语句

我已尝试在EXTRAS捆绑包中将
ContentResolver.SYNC_EXTRAS_EXPEDITED
ContentResolver.SYNC_EXTRAS_MANUAL
设置为
true
,但没有效果。我还通过自己的日志验证了
帐户
权限
是否正确。当同步成功时,我还会看到
onPerformSync:…
日志,因此我知道我没有像使用
SyncAdapters
的许多人那样错误地使用Logcat


我知道请求同步是一个相当复杂的过程,但至少有什么方法可以让我知道同步被拒绝的原因吗?其他日志似乎没有说明它为什么决定忽略我的请求。

您是否找到了有时不调用onPerformSync的原因?不幸的是,我对这个特定问题记不太清楚。我不相信自己找到了真正的解决方案,而是接受了
.requestSync()
不可靠的事实。我不得不通过简单地避免这种方法来解决这个问题。我会直接调用我的同步代码,而不是通过
SyncAdapter
手动跟踪同步当前是否处于活动状态。我真的没有一个解决方案不幸的是,我几乎只是黑客围绕它。感谢详细的答复。如果某些同步没有正确完成,那么在同步适配器中可能会执行某种限制。你的破解听起来也是一个很好的解决方案。你知道为什么有时候不调用onPerformSync吗?不幸的是,关于这个问题,我记不太清楚了。我不相信自己找到了真正的解决方案,而是接受了
.requestSync()
不可靠的事实。我不得不通过简单地避免这种方法来解决这个问题。我会直接调用我的同步代码,而不是通过
SyncAdapter
手动跟踪同步当前是否处于活动状态。我真的没有一个解决方案不幸的是,我几乎只是黑客围绕它。感谢详细的答复。如果某些同步没有正确完成,那么在同步适配器中可能会执行某种限制。你的破解听起来也是个不错的解决方案。