Androidでデータを同期するための設計


23

ほとんどのアプリでサーバーとクライアント間でデータを同期するための2つの実装を見てきました。これは、GCMがセットアップされていないことを前提としています:

  1. ネットワークからデータをダウンロードしてデータベースに保存するインテントサービスを定期的に実行します。
  2. 定期的に実行される同期アダプターの実装。

上記のどれをアプリに含めることをお勧めしますか?その理由は何ですか?

回答:


12

注:同期アダプターは非同期で実行されるため、データを定期的かつ効率的に転送することを期待して使用する必要がありますが、即時ではありません。リアルタイムのデータ転送を行う必要がある場合は、AsyncTaskまたはIntentServiceで行う必要があります。- ソース

基本的に、リアルタイム転送が必要な場合はIntentService(最初のオプション)を使用し、そうでない場合はSyncAdapterを使用します。IntentServiceの方がカスタマイズしやすいと思うので、私はIntentServiceを好みますが、もっと簡単なアプローチはSyncAdapterを使用することです。


18

必要な同期の種類に大きく依存します。

定期的

アプリが毎日特定の時間に投稿を発行するニュースアプリ(毎日午前7時45分)の場合、午前8時にバックグラウンドサービスで定期的なタスクを実行します。

:ドリッパー。毎日1回(午後6時30分頃)通知されます。定期的なタスクを使用していると思います。

トリガーされたイベント

データ転送がユーザーのアクションによってトリガーされる場合は、データ転送にバックグラウンドサービスまたはAsyncTaskを使用します。

:DropBox / Evernote。アプリを操作すると同期します。

瞬時に

アプリでインスタントメッセージング/メール/定期的ではない重要な更新を実行する場合は、プッシュ通知が必要です。ユーザーにすぐにアラートを送信するためです。この場合は、GCMまたはParseを使用します。例:WhatsApp / Googleチャット。あなたが明示的にあなたがGCMを使用したくない言及したので、あなたはなぜ、私が教えてくれるはずです代わりに、独自のものを書くの標準プッシュ通知プロバイダを使用します。

プッシュ通知は瞬時に機能します-遅延はほとんどありません(数秒、まれに数分)。これを行うための独自のソリューション/ライブラリを実装する場合、単純なモデルでは、ステータスを確認するために1秒ごと、5秒ごと、または1分ごとにサーバーにpingを実行します。これは、CPU(およびバッテリー)、モバイルの帯域幅、サーバーの負荷を消費するため、非常に非効率的です。ただし、GCM / Parseでは、常にサーバーに対してポートを開いたままにします(こちらを参照)。これが標準で最も効率的な方法です。さらに、10個のアプリがGCMを使用する場合、10個のオープン接続は必要ありません。デバイスごとに1個だけ必要です。そして、あなたはそうする正当な理由/資金/時間がない限り、あなた自身のソリューションを開発したくありません。

同期アダプターに関する注意:同期アダプターは、上記の3つのすべてのケースでうまく機能します。同期アダプターの実行を確認すると、GCMまたは独自のメカニズム(イベントトリガーまたはカスタムソリューション)またはネットワークの可用性(イベントトリガー)または定期的なイベントに依存していることがわかります。全体として、これは毎回長い初期化リストを作成したり、上記のすべてのケースを1か所で実装したりすることなく、データを同期するための便利なクラスです。


拡張質問として、試合のライブスコアを更新する必要がある場合、この状況に適した瞬間的なシナリオはありますか?一致する詳細を含む画面があり、ユーザーがその画面にいる間、スコアは同期または手動更新なしで自動的に更新されるはずです。それで、gcmは正しい一歩ですか?
gaara87 14

@AkashRamaniこの場合にGCM / Parseを使用しない理由はわかりません。ただし、GCMは無料ですが、Parseは一定のポイントを超えて請求します。更新が4096バイト以内であれば、更新を直接送信できます。スコアの更新が非常に頻繁に行われる場合は、GCM(たとえば、クリケットのスコア)の代わりにポーリングが良いアイデアかもしれません。ポーリングとGCMの両方のレイテンシとCPU /バッテリー消費をテスト/プロファイルすることをお勧めします。
サンディープ14

AWSには、クロスプラットフォームおよびクロスマーケットである通知ソリューションもあります。参照:docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin

3

SyncAdapter他の回答では言及されていないaの1つの側面があります。

このSyncAdapterパターンでは、同期する特定のContentProvider機関と、同期される特定のアカウントタイプ(認証システムを参照)が必要です。そのため、アーキテクチャ内にこれらのコンポーネントが既に存在しない限り(たとえば、他のアプリにデータへのアクセスを許可したり、アカウントをサポートする必要があるため)、SyncAdapter実装のオーバーヘッドが大きくなります。


2

接続性を含むデータの同期に関しては、スケーリングも可能にする必要があります。推奨される方法は、同期アダプターを使用することです。

また、Androidのトレーニングガイドを確認すると、そのように見えます:同期アダプターの作成

アプリの同期アダプターコンポーネントは、デバイスとサーバー間でデータを転送するタスクのコードをカプセル化します。アプリで提供するスケジューリングとトリガーに基づいて、同期アダプターフレームワークは同期アダプターコンポーネントでコードを実行します...


2

データ変更、経過時間、時刻などのさまざまな基準に基づいてデータ転送を自動化するため、リアルタイムデータが必要でない限り、同期アダプタを使用する必要があります。他のアプリからのデータ転送により、バッテリーの使用量が削減されます。

使用できる瞬時のタスクには、

短時間のタスクのAsyncTaskは、3〜4秒です。

長時間実行タスク用のIntentService


経験則の選択肢の大きな内訳。
ブリルパッピン

0

設計について話しているので、SyncAdapters、SyncResultオブジェクト、およびその後の処理の管理について言及する必要があります。

実際にSyncAdapterを使用して、サーバーにIntentService Web呼び出しを行うようにライブラリに指示します。この「同期」操作の管理には注意が必要です。

私が現在取っているアプローチの1つは、SyncResultオブジェクトを完全に放棄し、サービスを使用して個々の「同期」の結果を記録することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.