2011-10-28 13 views
16

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.

+0

+1! Zajęło nam wiele godzin frustracji, dopóki nie spojrzeliśmy na to i wywołaliśmy setIsSyncable! Dziękuję Ci! –

+0

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

+0

Zaktualizowałem moje pytanie, więc część pytania jest bardziej przejrzysta. Chcę, żeby ktoś wyjaśnił lub wyjaśnił, dlaczego takie zachowanie występuje. –

Odpowiedz

6

Zauważyłem, że contentResolver.requestSync() nigdy nie wyzwoli Twojego SyncAdapter.onPerformSync(), chyba że zadzwonisz pod numer ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);.

Szczegółowy rachunek roztworu poszedłem z użyciem SyncAdapter zobacz moją odpowiedź tutaj:

https://stackoverflow.com/a/12015967/988870

+0

Mam do czynienia z tym samym problemem, dzięki za odpowiedź. –

4

Właśnie uderzył moją głową o ścianę godzinami próbuje dowiedzieć się, dlaczego okresowa synchronizacja nie był” t działa. Okazuje się, że częstotliwość odpytywania musi być w sekundach (dosłownie), a nie w milisekundach, a nie w sekundach w milisekundach. Tak więc, na przykład, jeśli chcesz synchronizować każdą minutą i pół, to musiałby zadzwonić:

  ContentResolver.addPeriodicSync(
        account, 
        authority, 
        Bundle.EMPTY, 
        90 
      ); 

Ponadto, pakiet przeszedł w nie może być null, jak to jest w dokumentacji, będzie rzucać NullPointerException.

Powiązane problemy