【问题标题】:Android SyncAdapter CallbackAndroid SyncAdapter 回调
【发布时间】:2016-05-22 01:36:26
【问题描述】:

我已经按照 SDK 中的 SimpleSyncAdapter 示例项目的方式实现了 SyncAdapter、AccountManager 和私有 ContentProvider。一切正常。

现在我想在从设置了特定标志的远程服务器下载新行时向用户显示一条消息。当同步完成时,我需要来自 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 类报告异常,但不实际报告同步是否成功完成。

我只是不知道哪个是最好的选择,而且我还没有看到任何使用这些解决方案的示例项目。

【问题讨论】:

  • 在完全相同的位置 - 你设法解决了吗?

标签: android callback synchronization android-syncadapter


【解决方案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;
}

在执行 registerContentObserver 时使用 notifyForDescendents 会非常有用。

【讨论】:

    【解决方案2】:

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

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

    如果什么都没有改变呢?一切都是最新的,或者您遇到了网络错误。

    1. 您可以将 syncAdapter 的状态作为 Google I/O 进行监听 应用程序,在BaseActivity 中搜索 mSyncStatusObserver
    2. 我查看了默认的 android 电子邮件应用,他们使用带有回调的 Singleton
    3. 您可以广播意图或使用 eventBus(例如方形 Otto)来通知您的 UI 任何行为。

    我更喜欢最后一个,因为它可以让您更详细地了解同步适配器中发生的事件。

    【讨论】:

    • 你有使用 Otto 和 SyncAdapter 的例子吗?
    • 抱歉,我目前没有,我有一个sample project,在 SyncHelper.java 中除了捕获错误之外,您还可以发送事件错误。在 UI 方面,它是一个常规的事件处理。
    • 出色的塞巴斯蒂安!! +1
    【解决方案3】:

    我们遇到了类似的情况,并为 SyncAdapter 编写了一个静态 Listener 接口。侦听器是活动并在数据可用时执行必要的操作(更新 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接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多