Дизайн для синхронізації даних в Android


23

Я бачив дві реалізації для синхронізації даних між сервером і клієнтом у більшості програм. Це передбачає, що GCM не налаштовано: -

  1. Періодично запускається служба намірів, яка завантажує дані з мережі та зберігає в базі даних.
  2. Впровадження адаптера синхронізації, який працює періодично.

Що з вищезазначеного ви б рекомендували мати у своєму додатку і чому?

Відповіді:


12

Примітка. Адаптери синхронізації працюють асинхронно, тому слід використовувати їх з розрахунком на те, що вони передаватимуть дані регулярно та ефективно, але не миттєво. Якщо вам потрібно здійснити передачу даних у режимі реального часу, вам слід зробити це в AsyncTask або IntentService. - джерело .

В основному, якщо вам потрібна передача в режимі реального часу, використовуйте IntentService (перший варіант), інакше SyncAdapter. Я віддаю перевагу IntentService, хоча тому, що він відчуває себе більш настроюваним, але більш тривіальним підходом було б використання SyncAdapter.


18

Це сильно залежить від того, який тип синхронізації вам потрібен.

Періодична

Якщо ваш додаток - це новинний додаток, який публікує публікації щодня в певний час (скажімо о 7.45 ранку щодня), тоді ви виконуєте періодичне завдання у фоновій службі, скажімо, о 8 ранку.

наприклад : Крапельниця. Вони повідомляють мене один раз щодня (близько 18:30). Я вважаю, що вони використовують періодичні завдання.

Подія запущена

Якщо ваша передача даних викликана діями користувача, то використовуйте фонову службу або AsyncTask для передачі даних.

наприклад : DropBox / Evernote. Вони синхронізуються під час взаємодії з додатком.

Миттєве

Якщо у вашій програмі запущено обмін миттєвими повідомленнями / поштою / неперіодичними важливими оновленнями, вам потрібні натискання сповіщень, оскільки ви хочете негайно попередити користувача. Використовуйте або GCM або Parse для цього випадку. наприклад: Чат WhatsApp / Google. Оскільки ви прямо вказали, що не хочете використовувати GCM, я розкажу, чому вам слід використовувати стандартного постачальника push-повідомлень, а не писати власного:

Push-сповіщення працює миттєво - затримка дуже невелика (порядку секунд, рідко хвилин). Якби ви реалізували своє власне рішення / бібліотеку для цього - у наївній моделі, ви будете пінг-сервер щосекунди чи 5 секунд чи хвилину, щоб перевірити стан. Це дуже неефективно, оскільки він споживає процесор (а отже, і акумулятор), пропускну здатність мобільного телефону та завантаження вашого сервера. Однак у GCM / Parse вони завжди зберігають порт відкритим разом із сервером (див. Тут ). Це стандартний та найефективніший спосіб. Крім того, якщо 10 додатків використовують GCM, вам не потрібно 10 відкритих підключень, вам потрібно лише одне на кожен пристрій. І ви дійсно не хочете розробляти своє власне рішення, якщо у вас немає поважних причин / коштів / часу для цього.

Примітка про адаптер синхронізації : адаптер синхронізації працює добре для всіх вищезгаданих трьох випадків. Поставте прапорець Запуск адаптера синхронізації, і ви побачите, що це або залежить від GCM або вашого власного механізму (тригер події або користувацьке рішення) або доступності мережі (тригер події) або періодична подія. Загалом, це хороший зручний клас для синхронізації даних без необхідності робити довгий список ініціалізацій кожного разу або реалізовувати всі вищезазначені випадки в одному місці.


Що стосується розширеного питання, чи потрібно мені оновлювати результати роботи матчу, чи моментальний сценарій є правильним для цього контексту? У мене екран із деталями відповідності, і коли користувач перебуває на цьому екрані, результати повинні автоматично оновлюватися без синхронізації чи оновлення вручну. Отже, чи буде гсм правильним кроком вперед?
gaara87

@AkashRamani Я не бачу причини, чому ви не повинні використовувати GCM / Parse для цього випадку. Однак GCM безкоштовний, коли Parse виставляє рахунки за певний момент. Якщо ваші оновлення знаходяться в межах 4096 байт, ви можете надіслати оновлення безпосередньо. Якщо оновлення балів дуже часте, опитування може бути гарною ідеєю замість GCM (скажімо, для балів крикету). Я б запропонував протестувати / профілювати як опитування, так і GCM на затримку та споживання процесора / акумулятора.
Сундеп

AWS також має рішення щодо сповіщень, що є кросплатформою та крос-ринком. Див: docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin

3

Є один аспект, про SyncAdapterякий не згадували інші відповіді.

SyncAdapterМодель вимагає , щоб у вас є конкретний ContentProvider орган , який ви синхронізувати і тип конкретної облікового запису (див Authenticator ) , який збирається бути синхронізований. Тому, якщо ви вже не маєте цих компонентів у своїй архітектурі (наприклад, тому, що надаєте іншим додаткам доступ до своїх даних або вам потрібно підтримувати облікові записи), це SyncAdapterпризведе до значних витрат на реалізацію.


2

Якщо мова йде про синхронізацію даних, яка передбачає підключення, ви також хочете мати можливість масштабування. Я вважаю, що рекомендованим способом вирішити це є використання адаптера синхронізації.

Це також здається таким чином, якщо ви ознайомитесь з посібником з навчання Android: Створення адаптера синхронізації

Компонент адаптера для синхронізації у вашому додатку інкапсулює код для завдань, які передають дані між пристроєм та сервером. На основі планування та тригерів, які ви надаєте у своєму додатку, рамка адаптера синхронізації запускає код у компоненті адаптера синхронізації ...


2

Адаптери синхронізації повинні використовуватися, якщо вам не потрібні дані в режимі реального часу, оскільки вона автоматизує передачу даних на основі різноманітних критеріїв, таких як зміни даних, минулий час, час доби тощо. Він централізує всі передачі даних, щоб передача даних здійснювалася спільно з передача даних від інших додатків, що зменшує витрату акумулятора.

Для миттєвих завдань, які ми можемо використовувати,

AsyncTask для завдань, які мають коротку тривалість, може становити 3-4 секунди.

IntentService для тривалих виконання завдань.


Чудова розбивка для вибору правил великого пальця.
Брілл Паппін

0

Оскільки ми говоримо про дизайн, слід згадати про управління SyncAdapters, об’єктом SyncResult і що буде після.

Я фактично використовую SyncAdapter, щоб сказати моїй бібліотеці здійснювати веб-дзвінки IntentService на мій сервер. Управління цією операцією "синхронізації" є складною.

Один із підходів, який я зараз використовую, - це повністю відмовитись від об'єкта SyncResult і просто скористатися сервісом для реєстрації результатів кожної окремої "Синхронізації"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.