Android'de veri senkronizasyonu için tasarım


23

Uygulamaların çoğunda sunucu ile istemci arasında veri senkronize etmek için iki uygulama görüyorum. Bu hiçbir GCM'nin kurulu olmadığını varsayar: -

  1. Verileri ağdan indiren ve veritabanında depolayan belirli bir servisin düzenli olarak çalıştırılması.
  2. Periyodik olarak çalışan bir Eşitleme Adaptörü uygulama.

Yukarıdakilerden hangisini uygulamanızda bulundurmanızı tavsiye edersiniz ve neden?

Yanıtlar:


12

Not: Eşitleme bağdaştırıcıları eşzamansız çalışır, bu nedenle verileri düzenli ve verimli bir şekilde aktarma beklentisiyle birlikte kullanmalısınız, ancak anında değil. Gerçek zamanlı veri aktarımı yapmanız gerekirse, bunu bir AsyncTask veya bir IntentService'de yapmanız gerekir. - kaynak .

Temel olarak, gerçek zamanlı aktarıma ihtiyacınız varsa IntentService (ilk seçenek) 'i kullanın, yoksa SyncAdapter. IntentService'i tercih ediyorum, çünkü daha kişiselleştirilebilir, ancak daha önemsiz bir yaklaşım bir SyncAdapter kullanmak olabilir.


18

Ne tür bir senkronizasyon gerektiğine bağlıdır.

Periyodik

Uygulamanız, her gün belirli bir saatte yayınlar yayınlayan bir haber uygulamasıysa (her gün saat 7.45'te diyelim), arka plan hizmetinde periyodik bir görev yürütüyorsunuz, saat 8: 00'de.

örn . : Drippler. Bana günde bir kez haber veriyorlar (akşam 6.30 civarında). Periyodik bir görev kullandıklarına inanıyorum.

Olay tetiklendi

Veri aktarımınız kullanıcı eylemi tarafından tetiklenirse, veri aktarımı için bir arka plan servisi veya bir AsyncTask kullanın.

örneğin : DropBox / Evernote. Uygulamayla etkileşime girdiğimde senkronize oluyorlar.

ani

Uygulamanız anında mesajlaşma / postalar / periyodik olmayan önemli güncellemeler çalıştırıyorsa, kullanıcıyı derhal uyarmak istediğiniz için push bildirimlerine ihtiyacınız vardır. Bu durumda GCM veya Ayrıştırma'yı kullanın. örneğin: WhatsApp / Google sohbeti. GCM'yi kullanmak istemediğinizi açıkça belirttiğinizden, neden kendi mesajınızı yazmak yerine standart bir push bildirim sağlayıcısı kullanmanız gerektiğini anlatacağım :

Anında bildirimler anında çalışır - çok az bir gecikme olur (saniye cinsinden, nadiren dakikalar halinde). Bunu yapmak için kendi çözümünüzü / kitaplığınızı uygulayacak olsaydınız - naif bir modelde, durumu kontrol etmek için sunucuya her saniye veya 5 saniyede bir veya bir dakikada ping işlemi yapardınız. Bu işlem CPU (ve dolayısıyla pili), cep telefonundaki bant genişliğini ve sunucunuzu yüklediği için çok fazla verimsizdir. Ancak, GCM / Ayrıştırmada, her zaman bir bağlantı noktasını sunucuyla açık tutarlar ( buraya bakın ). Bu standart ve en verimli yoldur. Ayrıca, 10 uygulama GCM kullanıyorsa, 10 açık bağlantıya gerek yoktur, her cihaz için yalnızca bir tane gerekir. Ve geçerli bir neden / fon / zamanınız olmadıkça, kendi çözümünüzü geliştirmek istemezsiniz.

Eşitleme Bağdaştırıcısı ile ilgili bir not : Eşitleme Bağdaştırıcısı, yukarıdaki üç durumun tümü için iyi sonuç verir. Kontrol Bir Sync Adaptörü Koşu ve bunu ya GCM veya kendi mekanizması (olay tetikleyici veya özel çözüm) veya ağ kullanılabilirlik (olay tetikleyici) veya periyodik olay bağlı olduğunu göreceksiniz. Sonuç olarak, bu, her seferinde uzun bir başlatma listesi yapmak zorunda kalmadan veri senkronizasyonu veya yukarıdaki tüm durumları tek bir yerde uygulamak için uygun bir sınıftır.


Uzatılmış bir soru olarak, bir karşılaşmanın canlı skorlarını güncellemem gerekirse, anlık senaryo bu bağlam için doğru olanı mı? Eşleşme ayrıntılarına sahip bir ekranım var ve kullanıcı bu ekranda iken, senkronizasyon veya manuel güncelleme olmadan puanlar otomatik olarak güncellenmelidir. Öyleyse gcm önünüzdeki doğru adım olur mu?
gaara87

@AkashRamani Bu vaka için GCM / Parse kullanmamanız için bir neden görmüyorum. Ancak, GCM ücretsizdir ve Ayrıştırma sizi belirli bir noktadan öteye götürür. Güncellemeleriniz 4096 bayt dahilindeyse, güncellemeyi doğrudan gönderebilirsiniz. Puan güncellemeniz çok sıksa, oy kullanma GCM yerine iyi bir fikir olabilir (örneğin, kriket puanları için). Gecikme ve GCM gecikme ve CPU / pil tüketimi için hem yoklama hem de GCM'yi test etmenizi öneririm.
Sundeep

AWS ayrıca, çapraz platform ve çapraz pazar olan bir bildirim çözümüne de sahiptir. Bakınız: docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin

3

SyncAdapterDiğer cevaplarda bahsedilmeyenin bir yönü vardır.

SyncAdapterDesen belirli bir olmasını gerektirir ContentProvider sen senkronize olduğu yetki ve belirli hesap türünü (bkz Authenticator'u senkronize edilmesi için gidiyor). Bu nedenle, mimarinizde bu bileşenler henüz mevcut değilse (örneğin, diğer uygulamalara verilerinize erişim izni verdiğinizden veya hesapları desteklemeniz gerektiğinden dolayı) SyncAdapterönemli bir uygulama ek yüküne neden olacaktır.


2

Bağlanabilirliği içeren verileri senkronize etmek söz konusu olduğunda, ölçeklendirmek de isteyebilirsiniz. Bunun için önerilen yolun Sync Adaptörünü kullanmak olduğuna inanıyorum.

Android traning kılavuzuna bakarsanız, bu şekilde görünüyor: Bir Eşitleme Adaptörü Oluşturma

Uygulamanızdaki senkronizasyon adaptörü bileşeni, cihaz ile sunucu arasında veri aktaran görevlerin kodunu içerir. Uygulamanızda sağladığınız zamanlama ve tetikleyicilere bağlı olarak, senkronizasyon adaptör çerçevesi senkronizasyon adaptör bileşenindeki kodu çalıştırır ...


2

Senkronizasyon Adaptörleri , gerçek zamanlı veriye ihtiyaç duymadığınız sürece kullanılmalıdır, çünkü Veri değişiklikleri, geçen süre, günün saati gibi çeşitli kriterlere göre veri transferini otomatikleştirir. Veri transferiniz ile birlikte yapılması için tüm veri transferlerini merkezileştirir. Batarya kullanımını azaltan diğer uygulamalardan veri aktarımı.

Anlık görevler için kullanabiliriz,

Kısa süreli görev için AsyncTask , 3-4 saniye olabilir.

Uzun süren görevler için IntentService .


Başparmak seçimleri kuralı için mükemmel çözüm.
Brill Pappin

0

Tasarım hakkında konuştuğumuzdan, SyncAdapters'ı, SyncResult nesnesini ve sonrasında olanları yönetmekten bahsetmeliyiz.

Aslında, kütüphaneme IntentService web sunucuma çağrılar yapmak için kütüphaneme söylemek üzere bir SyncAdapter kullanıyorum. Bu "senkronizasyon" işlemini yönetmek zordur.

Şimdi alıyorum bir yaklaşım tamamen SyncResult nesnesinden vazgeçmek ve her "Sync" her bireyin sonuçlarını günlüğe kaydetmek için sadece bir hizmet kullanmaktır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.