如何监听 Android SyncAdapter 的进度?

6

我记得曾经读到过一个广播接收器接口,可以从同步适配器或某些同步进度事件的ResultReceiver中获取。这个接口是内置于SyncAdapter模式中还是自己开发的呢?


我已使用此方法通过Activity更新UI上的进度。由于我没有计时同步适配器,因此我使用了不确定的进度。 我会查看您的同步代码,以了解如何避免出现持续不断的过程,例如使用在线程组中工作的多个线程或执行器服务。 您还可以每隔几秒钟/分钟向接收器发送额外的参数,例如 code intent.putExtra(SYNCING_STATUS_TIME, 30); code - Lettings Mall
2个回答

11

我刚刚从同步适配器中实现了一个广播接收器,它像钟表一样运行良好!

我使用一个设置为内部类的接收器,并在 onCreate 中调用 registerReceiver,在 onDestroy 中调用 unregisterReceiver 来完成此操作。

由于我有一个策略方法来生成和查询多个线程,因此在 SyncAdapter 运行的开始时,我只有:

Intent intent = new Intent();
intent.setAction(ACTION);
intent.putExtra(SYNCING_STATUS, RUNNING);
context.sendBroadcast(intent); 

同步运行结束后,我得到了以下结果:

intent.putExtra(SYNCING_STATUS, STOPPING);
context.sendBroadcast(intent); 

在我的Activity中,我声明:

onCreate(Bundle savedInstance){

super.onCreate(savedInstance);
SyncReceiver myReceiver = new SyncReceiver();
RegisterReceiver(myReceiver,ACTION);

}



onDestroy(){

super.onPause();
unRegisterReceiver(myReceiver);

}



 public class SyncReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
            Bundle extras = intent.getExtras();
    if (extras != null) {
        //do something  
    }
   }
 }

对于这种情况,您无需将接收器添加到清单文件中。只需按原样使用即可!


邮件 这很有趣,可能非常准确,但问题是关于监听(监控)进度的。问题在于我的同步适配器一直在运行,没有尽头,所以我想向用户界面提供进度。 - mobibob
我已经使用这个来通过活动在UI上更新进度。由于我没有计时同步适配器,所以我使用了一个不确定的进度。我会查看您的同步代码,以了解如何在不是连续不停止的过程的情况下使用它,例如使用一组线程或执行器服务。 - Lettings Mall
如果您正在寻找一种操作SyncAdapter的开始和结束的方法,那么这就是最佳答案。 - MurifoX
一个简单的扩展来提供用户进度信息是添加另一个广播Extra intent.putExtra(SYNCING_STATUS_PROGRESS, ITEMS_PROCESSED_PRECENT)。然后当Activity看到 SYNC_START 时显示中间进度旋转器。当Activity看到 SYNCING_STATUS_PROGRESS 时显示进度条。 - Diederik
5
虽然这对大多数情况都适用,但无法处理在 SyncAdapter 已经运行时启动 Activity 的情况。您将不会收到初始广播。(如果您想在 SyncAdapter 端创建一个接收器以响应状态请求,那么问题在于它与适配器本身在同一线程中运行,并且无法及时响应。) - Paul Lammertsma

5

有效方法:

在2010年Google IO会议中提出的方法(开发Android REST客户端应用程序)是将列作为标记放入ContentProvider中,以指示正在获取、放置或其他记录。这允许在UI中放置每行旋转器(或其他视觉更改)。您可以通过自定义CursorAdapter驱动ListView来实现。您的ContentProvider需要根据需要更改标志。

无效方法:

您还可以使用SyncStatusObserver - 这几乎是无用的,因为它响应每个状态更改,而不仅仅是您特定的帐户/内容权限对,而且真的不能告诉您任何有关正在同步的内容,也不能区分“同步事件开始”和“同步事件结束”。毫无价值。:P


1
我采用了发布-订阅模式,使用ResultReceiver从同步线程向UI回复。服务在同步线程运行时添加和删除订阅者,如果有任何可用的订阅者,则广播给活动接收器。我考虑使用SyncStatusObserver触发UI,表明已触发定期同步 - 我将其代理为“start-sync”订阅状态事件。 - mobibob

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