2012-02-13 88 views
8

我已經沿着SDK中SimpleSyncAdapter示例項目的行實現了SyncAdapter,AccountManager和私有ContentProvider。這一切都運作良好。Android SyncAdapter回撥

現在我想向用戶顯示一條消息,當從遠程服務器上下載了新的行並設置了特定標誌時。當Sync完成時,我需要從SyncAdapter進行回調,以便我可以執行查詢並顯示來自活動的消息。我在StackOverflow上看到了一些關於這個問題的問題,但沒有一個答案很好。

How does one listen for progress from Android SyncAdapter?表示SyncStatusObserver無用。用戶mobibob建議使用ResultReceiver從同步線程迴應UI。

How to know when sync is finished?建議在您的SyncService中使用Intent。

How to signal sync-complete to the Android SyncManager?建議使用SyncResult。由maxpower47鏈接的示例代碼使用SyncResult類來報告異常,但不實際報告同步是否已成功完成。

我只是不知道哪個是最好的選擇,我還沒有看到任何使用這些解決方案的示例項目。

+0

完全一樣的位置 - 你是否設法解決這個問題? – HGPB 2013-02-13 12:08:40

回答

1

我知道這是一個老問題,但我自己也在問同樣的事情。 我發現了什麼是一個很好的解決方案,特別是因爲我處理本地數據有你在,就是用從ContentResolver的下列方法:

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) 

此註冊一個觀察者類,得到回調時的數據確定由給定的內容URI改變。但只有在您的ContentProvider發送通知時纔會發生這種情況。因此,舉例來說,如果你想獲得對ContentObserver通知上面通過ContentProvider的數據庫上進行的所有更新,您的ContentProvider應該實現類似於此更新:

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

使用notifyForDescendents當你做一個registerContentObserver可很有用。

1

這是一個老問題,但我在過去幾天做了一些研究,並且syncAdapter處理網絡請求和通知UI方面的示例並不多。

首先,您應該使用帶有contentProvider的Loaders來讓您的生活更輕鬆。您不需要再註冊內容解析器,Loader就可以爲您做。所以這意味着您的用戶界面會收到通知您的內容提供商的任何內容。

如果沒有改變怎麼辦?一切都是最新的,或者你有一個網絡錯誤。

  1. 你可以聽你的syncAdapter作爲谷歌I/O 應用程序做的狀態,在BaseActivity
  2. 我看了一下默認的Android郵件應用中搜索mSyncStatusObserver和他們使用Singleton與回調。
  3. 您可以使用BroadcastIntents或使用eventBus(方形Otto作爲例子)來通知您的UI有任何行爲。

我更喜歡上一個,因爲它可以讓您更精確地瞭解syncAdapter中發生的事件。

+0

你有沒有使用Otto和SyncAdapter的例子? – toobsco42 2015-05-04 15:41:22

+0

對不起,我目前沒有一個,我有一個[示例項目](https://github.com/sebastienrouif/notesSyncAdapter)在SyncHelper.java中除了捕獲錯誤之外還可以發送事件錯誤。在用戶界面這是一個常規的事件處理。 – Sebastien 2015-05-05 16:00:21

+0

輝煌塞巴斯蒂安! +1 – 2016-01-28 08:12:31

-2

我們遇到了類似的情況,並向SyncAdapter寫了一個靜態偵聽器接口。監聽器是活動並在數據可用時執行必要的操作(更新UI)。當自動同步期間系統調用同步適配器時,此偵聽器將爲空,並且同步進程將介意自己的業務,這也適用。

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(); 
    } 

然後在Activity中執行SyncAdapter.Listener接口。