Chcę pokazać pasek postępu w pasku akcji, podczas gdy mój SyncAdapter aktywnie synchronizuje zawartość do iz sieci.Animacja działająca SyncAdapter - jak sprawdzić, czy SyncAdapter aktywnie synchronizuje
Próbowałem korzystać z SyncStatusObserver wraz z ContentProvider.addStatusChangeListener. Jednak nie mogę sprawdzić, czy SyncAdapter działa aktywnie. Mogę tylko sprawdzić:
- SyncAdapter czeka użyciu ContentResolver.isSyncPending
- SyncAdapter czeka lub aktywnie pracuje używając ContentResolver.isSyncActive
Flagi te można łączyć ze sobą: !isSyncPending && isSyncActive
tak, że możliwe jest, aby sprawdzić, czy SyncAdapter aktywnie działa i nie ma żadnych oczekujących prac. Jednak w niektórych przypadkach SyncAdapter aktywnie działa ORAZ czeka na niego druga oczekująca prośba.
Wydaje się to takie proste, ale nie mogę znaleźć sposobu na obejście tego problemu. Posiadanie paska postępu widocznego, gdy narzędzie SyncAdapter nie jest uruchomione, daje użytkownikom wrażenie, że synchronizacja przebiega bardzo wolno. Nie pokazanie ProgressBar sprawia, że użytkownik myśli, że nic się nie dzieje.
Powyższe rozwiązanie w kodzie pokazano poniżej. Rejestrujemy obserwatora w activity.onResume:
int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
syncHandle = ContentResolver.addStatusChangeListener(mask, syncObserver);
syncObserver jest tu definiowany jako:
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();
}
}
Dla Eclair, Froyo, pierniki, rozwiązania powyżej działają tylko wtedy, gdy urządzenie ma tylko jedno konto. Jeśli na urządzeniu istnieje więcej niż jedno konto, pierwsze konto będzie zsynchronizowane; reszta jest ignorowana. – ChuongPham