2012-02-13 150 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接口。