【发布时间】:2014-03-04 01:59:47
【问题描述】:
我想在我的 SyncAdapter 主动与网络同步内容时,在 ActionBar 中显示一个 ProgressBar。
我尝试将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();
}
}
【问题讨论】:
标签: android android-contentresolver android-syncadapter