Podczas korzystania z mojego SyncAdapter natknąłem się na nieco dziwne zachowanie.SyncAdapter nie jest wywoływany w zależności od kolejności wywołań konfiguracji konta
Po pierwszej instalacji aplikacji (po odinstalowaniu przez adb) uruchamia się i tworzy konto. W zależności od kolejności niektórych instrukcji (patrz poniżej), funkcja onPerformSync() mojego SyncAdapter nigdy nie zostanie wywołana; moje konto w sekcji "Konta i synchronizacja" pokazuje, że ikona "synchronizacji w toku" kręci się w nieskończoność. Jeśli odznaczę pole wyboru synchronizacji obok konta mojej aplikacji, a następnie ponownie je sprawdzę, moja funkcja onPerformSync() zostanie natychmiast wywołana.
Powoduje to, że mój SyncAdapter nigdy nie będzie wywoływany. Ikona „Synchronizacja w toku” obraca się zawsze, chyba że zaznaczenie, a następnie ponownie sprawdzić synchronizacji wyboru:
final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
Z tego uporządkowania tych samych stwierdzeń, wszystko działa perfekcyjnie:
final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
mAccountManager.addAccountExplicitly(account, mPassword, null);
Domyślam czy wprowadzam program SyncManager w stan niespójności z powodu natychmiastowego wywołania żądania synchronizacji podczas tworzenia konta, a ja zmieniam jego konfigurację pod jego stopami. Ale (ledwo spójna) dokumentacja nie wspomina o żadnych problemach z wywoływaniem tych funkcji, kiedy tylko chcesz.
Jak na bok, aby inni walczą z SyncAdapters, stwierdziliśmy, że contentResolver.requestSync()
nigdy nie będą powodować SyncAdapter.onPerformSync()
chyba nazwać ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
.
Czy ktoś mógłby wyjaśnić to zachowanie? Dokumentacja dotycząca kont i synchronizacji jest nieco niejasna.
Otrzymuję to zachowanie na emulatorze 2.1, kompilując przeciwko zestawowi SDK 2.1.
+1! Zajęło nam wiele godzin frustracji, dopóki nie spojrzeliśmy na to i wywołaliśmy setIsSyncable! Dziękuję Ci! –
Bardzo pouczające. Napisz odpowiedź na swoje własne pytanie, abyśmy wiedzieli, że nie ma go już na liście "bez zadawania pytań". – rds
Zaktualizowałem moje pytanie, więc część pytania jest bardziej przejrzysta. Chcę, żeby ktoś wyjaśnił lub wyjaśnił, dlaczego takie zachowanie występuje. –