Я хочу показать ProgressBar в ActionBar, в то время как мой SyncAdapter активно синхронизирует контент с Интернетом и из него.
Я попытался использовать SyncStatusObserver вместе с ContentProvider.addStatusChangeListener. Однако я не могу проверить, активно ли активен SyncAdapter. Я могу только проверить:
- SyncAdapter ожидает использования ContentResolver.isSyncPending
- SyncAdapter ожидает или активно работает с помощью ContentResolver.isSyncActive
Эти флаги можно объединить: !isSyncPending && isSyncActive
, чтобы можно было проверить, что SyncAdapter активно работает и не имеет ожидающей работы. Однако в некоторых случаях SyncAdapter активно работает и ожидает второго ожидающего запроса.
Кажется, это так просто, но я не могу найти пути решения этой проблемы. Наличие ProgressBar, видимого, когда SyncAdapter не работает, дает пользователям впечатление, что синхронизация выполняется очень медленно. Если он не показывает 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();
}
}