我希望在我的SyncAdapter正在从网络上主动同步内容时,在ActionBar中显示一个ProgressBar。
我尝试使用SyncStatusObserver和ContentProvider.addStatusChangeListener,但是我无法检查SyncAdapter是否正在运行。我只能检查:
1. 使用ContentResolver.isSyncPending检查SyncAdapter是否挂起。 2. 使用ContentResolver.isSyncActive检查SyncAdapter是否挂起或正在运行。
这些标志可以组合使用:
这似乎很简单,但我找不到解决这个问题的方法。当SyncAdapter未运行时显示ProgressBar会让用户觉得同步非常缓慢。如果不显示ProgressBar,用户会认为什么都没有发生。
上述代码中的解决方案如下所示。我们在activity.onResume中注册观察者:
我尝试使用SyncStatusObserver和ContentProvider.addStatusChangeListener,但是我无法检查SyncAdapter是否正在运行。我只能检查:
1. 使用ContentResolver.isSyncPending检查SyncAdapter是否挂起。 2. 使用ContentResolver.isSyncActive检查SyncAdapter是否挂起或正在运行。
这些标志可以组合使用:
!isSyncPending && isSyncActive
,以便检查SyncAdapter正在积极工作且没有任何待处理工作。然而,在某些情况下,SyncAdapter正在积极工作并且有第二个等待它的挂起请求。这似乎很简单,但我找不到解决这个问题的方法。当SyncAdapter未运行时显示ProgressBar会让用户觉得同步非常缓慢。如果不显示ProgressBar,用户会认为什么都没有发生。
上述代码中的解决方案如下所示。我们在activity.onResume中注册观察者:
int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
syncHandle = ContentResolver.addStatusChangeListener(mask, syncObserver);
syncObserver在这里被定义为:
syncObserver = new SyncStatusObserver()
{
@Override
public void onStatusChanged(int which)
{
Account account = getSomeAccount();
boolean syncActive = ContentResolver.isSyncActive(account, CONTENT_AUTHORITY);
boolean syncPending = ContentResolver.isSyncPending(account, CONTENT_AUTHORITY);
boolean isSynchronizing = syncActive && !syncPending;
updateRefreshButtonState();
}
}