Pętle synchronizacji po raz pierwszy w nieskończoność
Mam sytuację z SyncAdapter Nie wiem, jak to naprawić.
Używam okresowych synchronizacji. Metoda onPerformSync rejestruje dla mnie pewne informacje, aby wiedzieć, że proces działa (nie ma wywołań powiadamiania o zmianach w dostawcach treści lub czymkolwiek innym).
Projekt składa się z dwóch aplikacji: pierwsza tworzy konto użytkownika (tylko w celach testowych). Drugi zawiera adapter synchronizacji. Należy pamiętać, że jest to całkowicie legalne dla zakresu projektu.
Najpierw instaluję aplikację z kontem. Widzę, że konto zostało utworzone.
Następnie instaluję aplikację przy użyciu adaptera synchronizacji i przy pierwszym uruchomieniu synchronizacja zawiesza się. Widząc ustawienia synchronizacji konta, ikona pokrętła ciągle działa i nie są rejestrowane żadne komunikaty dziennika (co oznacza, że nie osiąga onPerformSync).
Mogę jednak anulować synchronizację w Ustawieniach, a następnie proces synchronizacji zacznie działać normalnie. Oznacza to, że okablowanie między kontem, dostawcą treści i usługą SyncService jest prawidłowo ustawione.
Jestem świadomy, że dodanie / usunięcie konta uruchamia inne procesy synchronizacji, więc pozwalam, aby upłynęło sporo czasu, zanim zainstaluję aplikację przy użyciu adaptera synchronizacji.
Jakieś wskazówki, dlaczego tak się dzieje?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAccountManager = AccountManager.get(this);
// No worries here. The account exists and it's the one I want
Account[] accounts = mAccountManager.getAccountsByType(Constants.ACCOUNT_TYPE);
// Just first account for TESTING purposes
if (accounts != null && accounts.length > 0)
account = accounts[0];
else {
Log.e(TAG, "No accounts set!!");
return;
}
// Set sync for this account.
Bundle extras = new Bundle();
extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
ContentResolver.setIsSyncable(account, authority, 1); // Mandatory since 3.1
// Allows the provider to sync when internet connection is back
ContentResolver.setSyncAutomatically(account, authority, true);
// Add a periodic synchronization
ContentResolver.addPeriodicSync(account, authority, extras, POLL_FREQUENCY);
}
EDYTOWAĆ
Dowiedziałem się, że wywołanie anulowania na synchronizacji sprawia, że działa. Nie najlepsze rozwiązanie, ale teraz rozwiązuje problem. Łączę tę linię z flagą „isFirstUse”.
ContentResolver.cancelSync(account, authority);