2013-04-14 22 views
14

Mam aplikację połączoną z usługą sieci Web, która korzysta z AccountManager i Sync, aby umożliwić użytkownikom logowanie się do swojego konta za pośrednictwem aplikacji i synchronizowanie ich danych (to są dane niestandardowe, a nie kontakty lub cokolwiek innego używane przez konta Google). AFAIK, robię wszystko tak, jak powinienem. Gdy użytkownik loguje się za pośrednictwem naszego API, zapisać swoje konto do Android AccountManager:Dlaczego system Android uruchamia synchronizację konta Google przy każdym dodawaniu/usuwaniu konta niestandardowego typu?

AccountManager am = AccountManager.get(context); 
m.addAccountExplicitly(new Account(username, ACCOUNT_TYPE), account_id, user_data); 

Mam zdefiniowane ACCOUNT_TYPE aby być po prostu nazwę pakietu aplikacji, które powinny być wystarczające, aby odróżnić go od innych koncie rodzaj.

Natychmiast po dodaniu konta, ustawić go do automatycznej synchronizacji:

ContentResolver.setSyncAutomatically(account, AUTHORITY, true); 
ContentResolver.addPeriodicSync(account, AUTHORITY, new Bundle(), SYNC_FREQUENCY_SECONDS); 

I zdefiniowanych SYNC_FREQUENCY_SECONDS jako 86400 (to znaczy, 1 dzień).

Podobnie, jeśli użytkownik się wyloguje, po prostu pobieram jego konto z AccountManager i wywołuję removeAccount(), aby go usunąć. Ładne i proste.

Synchronizacja odbywa się za pomocą mojego własnego kodu, ponieważ wszystkie dane niestandardowe są zsynchronizowane i wszystko działa dobrze. Jednak to, co doprowadza mnie do szaleństwa, polega na tym, że za każdym razem, gdy używam tego kodu do dodawania lub usuwania konta (własnego typu), natychmiast uruchamia synchronizację wszystkich kont Google na urządzeniu. Oznacza to, że zanim zsynchronizuje moje dane, najpierw musi zsynchronizować wszystkie wiadomości e-mail, dane kalendarza, kontakty, czasopisma Google Play, dane i zdjęcia Google+ itp. Itp. Może to potrwać kilka minut, podczas których moja aplikacja tylko cierpliwie czeka na swoją kolej, aby zsynchronizować dane. Jest to bardzo frustrujące i dla moich użytkowników będzie ciężko zrozumieć, dlaczego synchronizacja danych po ich zalogowaniu trwa tak długo (nie wspominając o tym, że kiedy synchronizuje się z tak dużą ilością danych, telefon ma tendencję do spowalniania prawie do momentu braku reakcji).

Czy robię coś nie tak? Czy jest coś w moim kodzie, które nieumyślnie mówi Androidowi: "Hej, idź i zsynchronizuj wszystkie swoje dane Google teraz!"? A może jest to czymś nieodłącznym w strukturze konta/synchronizacji Google, którą muszę tylko znosić?

+1

Czy wyłączyć funkcję Autosync (jeśli jest włączona) dodać/usunąć swoje konto niestandardowe, a następnie ponownie je włączyć? –

+0

Interesujący pomysł. Spróbuję. –

Odpowiedz

2

Myślę (choć nie jestem w 100% pewny), że jest to funkcja oszczędzania energii; bardziej efektywne pod względem baterii jest wysyłanie jednej długiej transmisji niż kilku krótszych transmisji, ponieważ radio pozostaje w stanie gotowości przez jakiś czas po zakończeniu transmisji, a zatem wysyłanie pojedynczej długiej transmisji pozwala uniknąć pozostawania w trybie czuwania (zasadniczo marnowanie moc) więcej niż jeden raz. Zgaduję więc, że infrastruktura synchronizująca próbuje zestawić razem tyle synchronizacji, ile to możliwe.

Jeśli przyczyną problemu jest opóźnienie pierwszej synchronizacji, być może można ręcznie poprosić o synchronizację przy pierwszej synchronizacji z dodatkowym czasem oprócz okresowej automatycznej synchronizacji?