Projekt do synchronizacji danych w Androidzie

23

Widziałem dwie implementacje do synchronizacji danych między serwerem a klientem w większości aplikacji. Zakłada się, że nie skonfigurowano GCM: -

  1. Okresowe uruchamianie usługi celowej, która pobiera dane z sieci i przechowuje w bazie danych.
  2. Implementowanie adaptera synchronizacji, który działa okresowo.

Które z powyższych poleciłbyś mieć w swojej aplikacji i dlaczego?

Rasmus
źródło

Odpowiedzi:

12

Uwaga: Adaptery synchronizacji działają asynchronicznie, dlatego należy ich używać, oczekując, że będą one regularnie i wydajnie przesyłać dane, ale nie natychmiast. Jeśli potrzebujesz transferu danych w czasie rzeczywistym, powinieneś to zrobić w AsyncTask lub IntentService. - źródło .

Zasadniczo, jeśli potrzebujesz transferu w czasie rzeczywistym, użyj IntentService (pierwsza opcja), w przeciwnym razie SyncAdapter. Wolę jednak usługę IntentService, ponieważ jest bardziej dostosowywalna, ale bardziej trywialnym rozwiązaniem byłoby użycie SyncAdapter.

Simon Zettervall
źródło
18

Zależy to w dużej mierze od rodzaju potrzebnej synchronizacji.

Okresowy

Jeśli twoja aplikacja jest aplikacją wiadomości, która publikuje posty o określonej godzinie każdego dnia (powiedzmy o 7.45 każdego dnia), wtedy uruchamiasz okresowe zadanie w usłudze działającej w tle, powiedzmy o 8 rano.

np . : Kroplownik. Powiadamiają mnie raz dziennie (około 18:30). Myślę, że używają okresowego zadania.

Zdarzenie wywołane

Jeśli transfer danych jest wyzwalany przez działanie użytkownika, użyj usługi w tle lub AsyncTask do transferu danych.

np . : DropBox / Evernote. Synchronizują się podczas interakcji z aplikacją.

Chwilowy

Jeśli Twoja aplikacja obsługuje wiadomości błyskawiczne / wiadomości e-mail / nieregularne ważne aktualizacje, potrzebujesz powiadomień wypychanych, ponieważ chcesz natychmiast powiadomić użytkownika. W tym przypadku użyj GCM lub Parse. np .: czat WhatsApp / Google. Ponieważ wyraźnie wspomniałeś, że nie chcesz używać GCM, powiem, dlaczego powinieneś używać standardowego dostawcy powiadomień wypychanych zamiast pisać własne:

Powiadomienia push działają natychmiastowo - opóźnienie jest bardzo małe (rzędu sekund, rzadko minut). Jeśli miałbyś zaimplementować do tego własne rozwiązanie / bibliotekę - w naiwnym modelu sprawdzałbyś serwer co sekundę lub co 5 sekund lub minutę, aby sprawdzić status. Jest to bardzo nieefektywne, ponieważ zużywa procesor (a tym samym baterię), przepustowość telefonu komórkowego i obciążenie serwera. Jednak w GCM / Parse zawsze utrzymują otwarty port z serwerem (patrz tutaj ). Jest to standardowy i najbardziej wydajny sposób. Ponadto, jeśli 10 aplikacji korzysta z GCM, nie potrzebujesz 10 otwartych połączeń, potrzebujesz tylko jednego na urządzenie. I naprawdę nie chcesz opracowywać własnego rozwiązania, chyba że masz ważny powód / fundusze / czas, aby to zrobić.

Uwaga na temat adaptera synchronizacji : Adapter synchronizacji działa dobrze we wszystkich powyższych trzech przypadkach. Zaznacz opcję Uruchom adapter synchronizacji, a zobaczysz, że zależy to od GCM lub własnego mechanizmu (wyzwalacza zdarzenia lub niestandardowego rozwiązania), dostępności sieci (wyzwalacza zdarzenia) lub zdarzenia okresowego. Podsumowując, jest to dobra wygodna klasa do synchronizacji danych bez konieczności długiej listy inicjalizacji za każdym razem lub implementacji wszystkich powyższych przypadków w jednym miejscu.

Sundeep
źródło
Jako pytanie rozszerzone, czy muszę aktualizować wyniki meczu na żywo, czy scenariusz natychmiastowy jest odpowiedni dla tego kontekstu? Mam ekran ze szczegółami dopasowania, a gdy użytkownik jest na tym ekranie, wyniki powinny być automatycznie aktualizowane bez synchronizacji lub ręcznej aktualizacji. Czy więc gcm byłby właściwym krokiem naprzód?
gaara87
@AkashRamani Nie widzę powodu, dla którego nie powinieneś używać GCM / Parse w tej sprawie. Jednak GCM jest bezpłatny, podczas gdy Parse wystawia rachunki poza określonym punktem. Jeśli twoje aktualizacje mieszczą się w granicach 4096 bajtów, możesz wysłać aktualizację bezpośrednio. Jeśli aktualizacje wyników są bardzo częste, odpytywanie może być dobrym pomysłem zamiast GCM (powiedzmy, w przypadku wyników w krykieta). Sugerowałbym przetestowanie / profilowanie zarówno odpytywania, jak i GCM pod kątem opóźnień i zużycia procesora / baterii.
Niedziela
AWS ma również rozwiązanie do powiadamiania, które działa na różnych platformach i na różnych rynkach. Zobacz: docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin
3

Jest jeden aspekt tego, o SyncAdapterktórym nie wspominają inne odpowiedzi.

SyncAdapterWzór wymaga, że masz specyficzne ContentProvider organ, który synchronizacji do i typ konta specyficzne (patrz Authenticator ), który będzie zsynchronizowany. Tak więc, chyba że masz już te komponenty w swojej architekturze (np. Ponieważ dajesz innym aplikacjom dostęp do swoich danych lub potrzebujesz obsługi kont) SyncAdapter, spowoduje to znaczny narzut związany z implementacją.

Kuna
źródło
2

Jeśli chodzi o synchronizację danych, które wymagają łączności, można również skalować. Uważam, że zalecanym sposobem rozwiązania tego problemu jest użycie adaptera synchronizacji.

Wydaje się, że tak właśnie jest, jeśli zapoznasz się z przewodnikiem dotyczącym tranzytowania Androida: Tworzenie adaptera synchronizacji

Komponent adaptera synchronizacji w aplikacji obudowuje kod zadań, które przesyłają dane między urządzeniem a serwerem. W oparciu o harmonogram i wyzwalacze podane w aplikacji środowisko adaptera synchronizacji uruchamia kod w komponencie adaptera synchronizacji ...

komar
źródło
2

Adaptery synchronizacji powinny być używane, chyba że potrzebujesz danych w czasie rzeczywistym, ponieważ: Automatyzuje transfer danych na podstawie różnych kryteriów, takich jak zmiany danych, upływający czas, pora dnia itp. Centralizuje wszystkie transfery danych, dzięki czemu transfer danych odbywa się w połączeniu z przesyłanie danych z innych aplikacji, co zmniejsza zużycie baterii.

Do natychmiastowych zadań możemy użyć,

Zadanie AsyncTask dla zadania trwającego krótko może trwać 3-4 sekundy.

Usługa IntentService do długotrwałych zadań.

Sajad Deyargaroo
źródło
Świetny podział na wybory z kciuka.
Brill Pappin,
0

Ponieważ mówimy o projektowaniu, powinniśmy wspomnieć o zarządzaniu SyncAdapters, obiekcie SyncResult i tym, co dzieje się później.

Właściwie korzystam z SyncAdapter, aby nakazać mojej bibliotece wykonywanie połączeń internetowych IntentService na mój serwer. Zarządzanie tą operacją „synchronizacji” jest trudne.

Jednym z moich podejść jest całkowite zrezygnowanie z obiektu SyncResult i po prostu skorzystanie z usługi do zarejestrowania wyników każdego pojedynczego „Synchronizacji”

Saik Caskey
źródło