Saya telah melihat dua implementasi untuk menyinkronkan data antara server dan klien di sebagian besar aplikasi. Ini mengasumsikan tidak ada GCM yang diatur: -
Menjalankan layanan maksud secara berkala yang mengunduh data dari jaringan dan menyimpannya dalam database.
Menerapkan Sync Adapter yang berjalan secara berkala.
Manakah di atas yang akan Anda rekomendasikan untuk ada di aplikasi Anda dan mengapa?
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.
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.
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.
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.
Ketika datang untuk menyinkronkan data yang melibatkan konektivitas Anda ingin dapat skala juga. Saya percaya cara yang disarankan untuk melakukannya adalah menggunakan Sync Adapter.
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 ...
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.
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
Ada satu aspek a
SyncAdapter
yang belum disebutkan oleh jawaban lainnya.The
SyncAdapter
pola 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 ituSyncAdapter
akan menyebabkan overhead implementasi yang signifikan.sumber
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
sumber
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.
sumber
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
sumber