Android同步适配器回调函数

8
我已经按照SDK中SimpleSyncAdapter示例项目的方式实现了SyncAdapter、AccountManager和私有ContentProvider。一切都很顺利。
现在,当从远程服务器下载具有特定标志的新行时,我想向用户显示一条消息。我需要从SyncAdapter获得回调,以便在活动中执行查询并显示消息。我在StackOverflow上看到了一些相关讨论,但没有一个好的答案。 如何监听Android SyncAdapter的进度? 表示SyncStatusObserver是无用的。用户mobibob建议使用ResultReceiver从同步线程向UI响应。 如何知道同步何时完成? 建议在SyncService中使用Intent。

如何向Android SyncManager发出同步完成信号?建议使用SyncResult。maxpower47链接的示例代码使用SyncResult类报告异常,但没有实际报告同步是否成功完成。

我不知道哪个选项最好,也没有看到任何示例项目使用这些解决方案。


在完全相同的位置 - 你解决了吗? - HGPB
3个回答

2
我知道这是一个老问题,但我自己也在问同样的问题。 我发现一种好的解决方法,特别是因为我像你一样处理本地数据,那就是使用ContentResolver中的以下方法:
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)

这个方法会注册一个观察者类,当特定的内容URI对应的数据发生变化时,它会得到回调。但是只有在你的ContentProvider发送通知时才会发生这种情况。例如,如果你想要通过上面的ContentObserver获得所有通过ContentProvider对数据库进行的更新的通知,你的ContentProvider应该实现类似于以下的update方法:

@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可以非常有用。


1

这是一个古老的问题,但我在过去几天进行了一些研究,发现关于syncAdapter处理网络请求和通知UI的示例并不多。

首先,您应该使用Loaders与contentProvider使您的生活更轻松。您不需要再为内容解析器注册,Loader会为您完成。因此,这意味着您的UI将被通知进入内容提供程序的任何内容。

如果没有任何更改?一切都是最新的或者您遇到了网络错误。

  1. 您可以像Google I/O应用程序一样监听您的syncAdapter的状态,请搜索BaseActivity中的mSyncStatusObserver。
  2. 我看了一下默认的Android电子邮件应用程序,它们使用带有回调的Singleton
  3. 您可以广播意图或使用事件总线(例如square Otto)来通知您的UI任何行为。
我更喜欢最后一个,因为它可以让你更细致地了解在同步适配器中发生的事件。

你有使用Otto和SyncAdapter的示例吗? - Etienne Lawlor
抱歉,我目前没有这个。但我有一个示例项目,其中在SyncHelper.java中除了捕获错误外,您还可以发送事件错误。在UI方面,它是常规的事件处理。 - Sebastien
太棒了,Sebastien!+1 - Lisa Anne

-2
我们遇到了类似的情况,并编写了一个静态监听器接口用于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();
    }

然后在Activity中实现SyncAdapter.Listener接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接