2012-02-13 10 views
8

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

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

How does one listen for progress from Android SyncAdapter?は、SyncStatusObserverは役に立たないと言います。ユーザーmobibobは、同期スレッドからUIに返答するためにResultReceiverを使用することを提案します。

How to know when sync is finished?は、SyncServiceのインテントを使用することを示しています。

How to signal sync-complete to the Android SyncManager?は、SyncResultを使用することを示しています。 maxpower47によってリンクされたサンプルコードは、SyncResultクラスを使用して例外を報告しますが、同期が正常に完了したかどうかを実際に報告することはありません。

どのオプションが最適かわかりませんし、これらのソリューションが使用されているサンプルプロジェクトは見ていません。

+0

全く同じ位置にあります - あなたはそれをうまく処理できましたか? – HGPB

答えて

1

これは古い質問ですが、私は同じことを自分自身に求めていました。

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) 

データが特定されたときにこれがコールバックを取得オブザーバークラスを登録します。私はあなたがそうであるように、私は、ローカルデータを扱っています、ContentResolverのから次のメソッドを使用することで、特別ので、良い解決策のようにして見つけたもの 指定されたコンテンツURIによって変更されます。しかし、それはあなたのContentProviderが通知を送る場合にのみ起こります。ですから、のContentProviderを使用してデータベースに行われたすべての更新のために上ContentObserverに通知取得したい場合、たとえば、あなたのContentProviderはこれに類似アップデート実装する必要があります:あなたがregisterContentObserverを行う際notifyForDescendentsを使用して

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

をすることができ非常に便利。

1

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

まず、あなたの人生を楽にするために、contentProviderでローダーを使用する必要があります。ローダーがコンテンツリゾルバーに登録する必要はありません。したがって、あなたのUIには、あなたのコンテンツプロバイダに何かが届いたことが通知されます。

変更がない場合はどうなりますか?すべてが最新であるか、ネットワークエラーが発生しました。 GoogleのI/O アプリはありません、mSyncStatusObserverの検索はBaseActivity

  • に、私はデフォルトのAndroidのメールアプリで見ていたし、彼らはSingletonを使用してあなたのsyncAdapterの状況を聞くことができる

    1. callBacks。
    2. BroadcastIntentsを使用することもできますし、eventBus(square Otto)を使用してUIに動作を通知することもできます。

    私はsyncAdapterで発生するイベントの細かさを向上させるため、最後の方が気に入っています。

  • +0

    OttoをSyncAdapterで使用する例はありますか? – toobsco42

    +0

    申し訳ありませんが、私は[サンプルプロジェクト](https://github.com/sebastienrouif/notesSyncAdapter)を持っています.SyncHelper.javaには、エラーを捕捉するだけでなく、イベントエラーを送信できる場所があります。 UI側では、通常のイベント処理です。 – Sebastien

    +0

    華麗なセバスチャン!! +1 –

    -2

    同様の状況に遭遇し、静的ListenerインターフェイスをSyncAdapterに書きました。リスナーはアクティビティであり、データが利用可能な場合に必要なアクションを実行します(UIの更新)。これは、このリスナーがnullになり、同期プロセスが独自のビジネスに気付く自動同期中に、システムによって同期アダプタが呼び出されたときにも機能します。

    class SyncAdapter extends AbstractThreadedSyncAdapter { 
    
        protected static Listener uiListener = null; 
        public interface Listener { 
         public void onSync(); 
        } 
        public static void setListener(Listener l) { 
         uiListener = l; 
        } 
        public static void clearListener() { 
         uiListener = null; 
        } 
        protected void broadcastSync() { 
         if (uiListener != null) 
          uiListener.onSync(); 
        } 
        public void onPerformSync(Account account, Bundle extras, String authority, 
              ContentProviderClient provider, SyncResult syncResult) { 
    
         // call broadcastSync(); 
        } 
    

    次に、アクティビティでSyncAdapter.Listenerインターフェイスを実装します。

    関連する問題