Desain untuk menyinkronkan data di Android

23

Saya telah melihat dua implementasi untuk menyinkronkan data antara server dan klien di sebagian besar aplikasi. Ini mengasumsikan tidak ada GCM yang diatur: -

  1. Menjalankan layanan maksud secara berkala yang mengunduh data dari jaringan dan menyimpannya dalam database.
  2. Menerapkan Sync Adapter yang berjalan secara berkala.

Manakah di atas yang akan Anda rekomendasikan untuk ada di aplikasi Anda dan mengapa?

Rasmus
sumber

Jawaban:

12

Catatan: Sinkronisasi adapter berjalan secara tidak sinkron, jadi Anda harus menggunakannya dengan harapan bahwa mereka mentransfer data secara teratur dan efisien, tetapi tidak secara instan. Jika Anda perlu melakukan transfer data waktu nyata, Anda harus melakukannya dalam AsyncTask atau IntentService. - sumber .

Pada dasarnya, jika Anda memerlukan transfer waktu nyata, gunakan IntentService (opsi pertama), kalau tidak SyncAdapter. Saya lebih suka IntentService karena rasanya lebih dapat dikustomisasi, tetapi pendekatan yang lebih sepele adalah dengan menggunakan SyncAdapter.

Simon Zettervall
sumber
18

Ini sangat tergantung pada jenis sinkronisasi yang Anda butuhkan.

Berkala

Jika aplikasi Anda adalah aplikasi berita yang mempublikasikan posting pada waktu tertentu setiap hari (misalkan jam 7.45 pagi setiap hari), maka Anda menjalankan tugas periodik di layanan latar belakang, katakan jam 8 pagi.

misal : Drippler. Mereka memberi tahu saya sekali setiap hari (sekitar jam 6.30 sore). Saya percaya mereka menggunakan tugas berkala.

Acara Dipicu

Jika transfer data Anda dipicu oleh tindakan pengguna, maka gunakan layanan latar belakang atau AsyncTask untuk transfer data.

misal : DropBox / Evernote. Mereka menyinkronkan ketika saya berinteraksi dengan aplikasi.

Seketika

Jika aplikasi Anda menjalankan olahpesan cepat / mail / pembaruan penting non-periodik , maka Anda perlu pemberitahuan push, karena Anda ingin segera memperingatkan pengguna. Gunakan GCM atau Parse untuk kasus ini. misalnya: WhatsApp / Google chat. Karena Anda menyebutkan secara eksplisit bahwa Anda tidak ingin menggunakan GCM, saya akan memberi tahu mengapa Anda harus menggunakan penyedia pemberitahuan push standar alih-alih menulis sendiri:

Pemberitahuan push berfungsi secara instan - hanya ada sedikit keterlambatan (dalam urutan detik, jarang menit). Jika Anda mengimplementasikan solusi / pustaka Anda sendiri untuk melakukan ini - dalam model naif, Anda akan melakukan ping server setiap detik atau 5 detik atau satu menit untuk memeriksa status. Ini sangat tidak efisien karena mengkonsumsi CPU (dan karenanya baterai), bandwidth pada ponsel dan memuat pada server Anda. Namun, dalam GCM / Parse, mereka selalu menjaga port terbuka dengan server (lihat di sini ). Ini adalah cara standar dan paling efisien. Plus, jika 10 aplikasi menggunakan GCM, Anda tidak perlu 10 koneksi terbuka, Anda hanya perlu satu per perangkat. Dan Anda benar-benar tidak ingin mengembangkan solusi Anda sendiri kecuali Anda memiliki alasan / dana / waktu yang valid untuk melakukannya.

Catatan tentang Sync Adapter : Sync Adapter berfungsi dengan baik untuk ketiga kasus di atas. Periksa Menjalankan Adaptor Sinkronisasi dan Anda akan melihat bahwa itu tergantung pada GCM atau mekanisme Anda sendiri (pemicu acara atau solusi khusus) atau ketersediaan jaringan (pemicu acara) atau peristiwa berkala. Secara keseluruhan, ini adalah kelas praktis yang baik untuk menyinkronkan data tanpa harus melakukan daftar panjang inisialisasi setiap kali atau untuk menerapkan semua kasus di atas di satu tempat.

Sundeep
sumber
Sebagai pertanyaan tambahan, jika saya perlu memperbarui skor langsung pertandingan, apakah skenario seketika yang tepat untuk konteks ini? Saya memiliki layar yang memiliki detail pertandingan dan saat pengguna berada di layar itu, skor akan secara otomatis diperbarui tanpa sinkronisasi atau pembaruan manual. Jadi gcm akan menjadi langkah tepat di depan?
gaara87
@AkashRamani Saya tidak melihat alasan mengapa Anda tidak harus menggunakan GCM / Parse untuk kasus ini. Namun, GCM gratis sementara Parse menagih Anda melampaui titik tertentu. Jika pembaruan Anda dalam 4096 byte, maka Anda dapat mengirim pembaruan secara langsung. Jika pembaruan skor Anda sangat sering, maka pemungutan suara mungkin merupakan ide yang baik daripada GCM (misalnya, untuk skor kriket). Saya akan menyarankan untuk menguji / profil polling dan GCM untuk latensi dan konsumsi CPU / baterai.
Sundeep
AWS juga memiliki solusi pemberitahuan yaitu lintas platform dan lintas pasar. Lihat: docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin
3

Ada satu aspek a SyncAdapteryang belum disebutkan oleh jawaban lainnya.

The SyncAdapterpola mengharuskan Anda memiliki tertentu ContentProvider otoritas yang Anda sync ke dan jenis account tertentu (lihat Authenticator ) yang akan disinkronisasikan. Jadi, kecuali Anda sudah memiliki komponen-komponen itu dalam arsitektur Anda (mis. Karena Anda memberi aplikasi lain akses ke data Anda atau Anda perlu mendukung akun), hal itu SyncAdapterakan menyebabkan overhead implementasi yang signifikan.

Kukus
sumber
2

Ketika datang untuk menyinkronkan data yang melibatkan konektivitas Anda ingin dapat skala juga. Saya percaya cara yang disarankan untuk melakukannya adalah menggunakan Sync Adapter.

Tampaknya juga seperti itu jika Anda melihat panduan traning Android: Membuat Adaptor Sinkronisasi

Komponen adaptor sinkronisasi di aplikasi Anda merangkum kode untuk tugas-tugas yang mentransfer data antara perangkat dan server. Berdasarkan penjadwalan dan pemicu yang Anda berikan di aplikasi Anda, kerangka kerja adaptor sinkronisasi menjalankan kode dalam komponen adaptor sinkronisasi ...

agas
sumber
2

Adaptor Sinkronisasi harus digunakan kecuali jika Anda memerlukan data waktu nyata karena, Ini mengotomatiskan transfer data berdasarkan berbagai kriteria, seperti perubahan data, waktu yang berlalu, waktu hari, dll. Ini memusatkan semua transfer data sehingga transfer data Anda dilakukan bersamaan dengan transfer data dari aplikasi lain, yang mengurangi penggunaan baterai.

Untuk tugas instan yang bisa kita gunakan,

AsyncTask untuk tugas yang durasinya pendek, mungkin 3-4 detik.

IntentService untuk tugas yang berjalan lama.

Sajad Deyargaroo
sumber
Kegagalan besar untuk pilihan aturan praktis.
Brill Pappin
0

Karena kita berbicara tentang desain, kita harus menyebutkan mengelola SyncAdapters, objek SyncResult, dan apa yang terjadi setelahnya.

Saya benar-benar menggunakan SyncAdapter untuk memberi tahu perpustakaan saya untuk membuat panggilan web IntentService ke server saya. Mengelola operasi "sinkronisasi" ini rumit.

Salah satu pendekatan yang saya ambil sekarang adalah sepenuhnya melupakan objek SyncResult dan hanya menggunakan layanan untuk mencatat hasil dari setiap "Sinkronisasi" individu

Saik Caskey
sumber