我想在ActionBar中显示ProgressBar,同时我的SyncAdapter主动将内容同步到网络和从网络同步内容。SyncAdapter运行动画 - 如何知道SyncAdapter是否正在同步
我试过用SyncStatusObserver和ContentProvider.addStatusChangeListener一起使用。但是,我无法检查SyncAdapter是否正在运行。我只能检查:
- SyncAdapter使用ContentResolver.isSyncPending
- 未决SyncAdapter挂起或使用ContentResolver.isSyncActive
这些标志可以组合积极开展工作:!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();
}
}
对于Eclair,Froyo,Gingerbread,上述解决方案仅适用于设备只有一个帐户的情况。如果设备上存在多个帐户,则第一个帐户将仅同步;其余的被忽略。 – ChuongPham