8

SDKのSimpleSyncAdapterサンプルプロジェクトに沿って、SyncAdapter、AccountManager、およびプライベートContentProviderを実装しました。それはすべてうまく機能しています。

ここで、特定のフラグが設定された新しい行がリモートサーバーからダウンロードされたときに、ユーザーにメッセージを表示したいと思います。クエリを実行してアクティビティからのメッセージを表示できるように、同期が終了したときにSyncAdapterからのコールバックが必要です。StackOverflowでこれについて説明している質問をいくつか見ましたが、良い答えはありません。

Android SyncAdapterの進捗状況をどのようにリッスンしますか?SyncStatusObserverは役に立たないと言います。ユーザーmobibobは、ResultReceiverを使用して同期スレッドからUIに応答することを提案しています。

同期がいつ終了したかを知る方法は?SyncServiceでインテントを使用することをお勧めします。

同期完了をAndroidSyncManagerに通知する方法は?SyncResultの使用を提案します。maxpower47によってリンクされたサンプルコードは、SyncResultクラスを使用して例外を報告しますが、同期が正常に完了したかどうかは実際には報告しません。

どちらが最適なオプションかわかりません。また、これらのソリューションのいずれかが使用されているプロジェクトの例を見たことがありません。

4

3 に答える 3

2

これは古い質問であることは知っていますが、私は同じことを自分自身に尋ねていました。私が良い解決策として見つけたのは、特にローカルデータを扱っているため、ContentResolver から次のメソッドを使用することです。

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)

これは、特定のコンテンツ URI によって識別されるデータが変更されたときにコールバックを取得するオブザーバー クラスを登録します。ただし、これは ContentProvider が通知を送信する場合にのみ発生します。たとえば、ContentProvider を介してデータベースで行われたすべての更新について、上記の ContentObserver で通知を受け取りたい場合、ContentProvider は次のような更新を実装する必要があります。

@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
    // code goes here
    this.getContext().getContentResolver().notifyChange(uri, null);
    return 0;
}

registerContentObserver を実行するときに notifyForDescendents を使用すると、非常に便利です。

于 2014-04-19T14:13:45.233 に答える
1

これは古い質問ですが、私は過去数日間調査を行いましたが、syncAdapter がネットワーク リクエストを処理し、UI に通知する例はあまりありません。

まず、ローダーを contentProvider とともに使用して、作業を楽にする必要があります。コンテンツ リゾルバに登録する必要はなくなりました。ローダーが登録してくれます。したがって、UI は、コンテンツ プロバイダーに送信されるすべての通知を受け取ることを意味します。

何も変わらなかったら?すべてが最新であるか、ネットワーク エラーが発生しました。

  1. Google I/O アプリと同じように、syncAdapter のステータスをリッスンできます。BaseActivity で mSyncStatusObserver を検索します
  2. デフォルトの Android メール アプリを調べたところ、callBacksでシングルトンを使用しています。
  3. BroadcastIntents または eventBus (正方形の Otto など) を使用して、UI に動作を通知できます。

syncAdapter で発生するイベントをより詳細に把握できるため、後者の方が気に入っています。

于 2015-01-16T11:41:31.587 に答える