web-dev-qa-db-ja.com

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

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

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

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

23
Rasmus

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

基本的に、リアルタイム転送が必要な場合はIntentService(最初のオプション)を使用し、それ以外の場合はSyncAdapterを使用します。私はIntentServiceを好みますが、それはよりカスタマイズ可能に感じるためですが、より簡単なアプローチはSyncAdapterを使用することです。

12

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

定期的

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

例::ドリップラー。彼らは私に毎日1回通知します(午後6時30分頃)。彼らは定期的な仕事をしていると思います。

トリガーされたイベント

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

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

瞬時

アプリがインスタントメッセージング/メール/非定期的な重要な更新を実行する場合、ユーザーにすぐに警告するため、プッシュ通知が必要です。この場合は、GCMまたはParseを使用します。例:WhatsApp/Googleチャット。 GCMを使用しないことを明示的に述べたので、独自に記述する代わりに標準のプッシュ通知プロバイダーを使用する必要がある理由を説明します:

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

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

18
Sundeep

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

SyncAdapterパターンでは、同期する特定の ContentProvider 権限と、同期される特定のアカウントタイプ( Authenticator を参照)が必要です。そのため、アーキテクチャにこれらのコンポーネントがすでにある場合(たとえば、他のアプリにデータへのアクセスを許可する場合や、アカウントをサポートする必要がある場合)を除いて、SyncAdapterは実装に大きなオーバーヘッドを引き起こします。

3
Marten

Sync Adaptersは、リアルタイムのデータが必要でない限り使用する必要があります。これは、データの変更、経過時間、時刻などのさまざまな基準に基づいてデータ転送を自動化するためです。データ転送は、他のアプリからのデータ転送と組み合わせて行われるため、バッテリーの使用量が削減されます。

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

AsyncTask短時間のタスクの場合、3〜4秒になることがあります。

IntentService長時間実行タスクの場合。

2

接続性を伴うデータの同期に関しては、スケーリングも可能にする必要があります。私はそれを行うために推奨される方法は同期アダプターを使用することだと思います。

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

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

2
user86794

デザインについて話しているので、SyncAdapters、SyncResultオブジェクト、およびその後の処理について説明する必要があります。

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

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

0
Saik Caskey