Android SyncAdaptercallback

我已经沿着SDK中SimpleSyncAdapter示例项目的行实现了SyncAdapter,AccountManager和私有ContentProvider。 这一切都很好。

现在,当从远程服务器下载新的行并设置了特定标志时,我想向用户显示一条消息。 当同步完成时,我需要从SyncAdapter进行callback,以便可以执行查询并显示来自活动的消息。 我在StackOverflow上看到过几个问题,但没有一个很好的答案。

如何从Android SyncAdapter监听进度? 说SyncStatusObserver是无用的。 用户mobibobbuild议使用ResultReceiver从同步线程回应UI。

如何知道同步完成的时间? build议在SyncService中使用Intent。

如何将同步完成信号发送到Android SyncManager? build议使用SyncResult。 由maxpower47链接的示例代码使用SyncResult类来报告exception,但不实际报告同步是否成功完成。

我只是不知道哪个是最好的select,我还没有看到任何使用这些解决scheme的示例项目。

Related of "Android SyncAdaptercallback"

我知道这是一个古老的问题,但我自己也在问同样的事情。 我发现作为一个好的解决scheme,特别是因为我正在处理本地数据,就是使用ContentResolver中的以下方法:

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) 

这注册了一个观察者类,当给定内容URI标识的数据发生变化时,该类将得到callback。 但是,只有当您的ContentProvider发送通知时才会发生这种情况。 例如,如果你想通过ContentProvider在上面的ContentObserver上得到关于你的数据库所做的所有更新的通知,你的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可能是非常有用的。

这是一个古老的问题,但我在过去几天做了一些研究,并且syncAdapter处理networking请求和通知UI的例子并不多。

首先,您应该使用带有contentProvider的Loaders来使您的生活更轻松。 你不需要再注册内容parsing器了。 所以这意味着你的用户界面得到通知你的内容提供商的任何东西。

如果没有改变呢? 一切都是最新的,或者你有一个networking错误。

  1. 您可以像Google I / O应用程序一样监听syncAdapter的状态,在BaseActivity中searchmSyncStatusObserver
  2. 我看了一下默认的android电子邮件应用程序,他们使用带有callBacks的Singleton 。
  3. 您可以使用BroadcastIntents或者使用eventBus(例如方形Otto)来通知您的UI有任何行为。

我更喜欢最后一个,因为它可以让你更精确地了解syncAdapter中发生的事件。

我们遇到了类似的情况,并写了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接口。