Android SyncAdapter:如何获得特定同步发生的通知

时间:2016-02-02 07:05:39

标签: android android-networking android-syncadapter

我有以下情况。

我在我的应用程序中使用SyncAdapter从服务器下载数据。

当用户打开应用时,我致电requestSync()以确保最新数据可用。

当用户请求时,我再次调用requestSync()传递我想要下载的特定数据包。

问题如下:

我可以使用SyncStatusObserver获取有关下载状态的通知,但这不会告诉我哪个同步已完成:

例如:

    在应用开始时
  • 我开始“总计”同步,

  • 然后用户请求刷新特定数据,因此我启动“基准foo的特定同步”

  • SyncStatusObserver会告诉我同步处于暂挂/有效状态,但不会告诉我这是“总计”同步还是基准foo的具体同步“

我该怎么做?

意图广播是唯一的方式吗?

1 个答案:

答案 0 :(得分:1)

SyncStatusObserver不会告诉您这一点,但有多种方法可以实现这一目标,这在很大程度上取决于您的架构。

这是适合我们的一个:

我们计划让我们的SyncAdapter返回另一个IBinder,并在将SyncService与特定操作绑定时返回该IBinder。此onBind(Intent)对象将提供有关同步适配器当前状态的信息。这是有效的,因为只有一个同步服务实例,而我们的同步服务只保存一个同步适配器实例。

这是一个简单的例子:

目前我们的同步服务的@Override public IBinder onBind(Intent intent) { return sSyncAdapter.getSyncAdapterBinder(); } 方法如下所示:

sSyncAdapter

其中public final static ACTION_SYNC_INFO = "com.example.SYNC_INFO"; @Override public IBinder onBind(Intent intent) { if (ACTION_SYNC_INFO.equals(intent.getAction()) { // sync info binder has been requested return sSyncAdapter.getSyncInfoBinder(); } // otherwise return the sync adapter binder return sSyncAdapter.getSyncAdapterBinder(); } 是我们的同步适配器的静态实例。

我们正计划将其改为:

SyncService.ACTION_SYNC_INFO

在我们的活动中,我们绑定了同步服务并设置了操作public interface SyncInfoBinder extends IBinder { public boolean isTotalSync(); } 。这告诉同步服务返回同步信息绑定器而不是同步适配器绑定器。

活页夹的界面可能如下所示:

private abstract class AbstractSyncInfoBinder extends Binder implements SyncInfoBinder
{
}

private final IBinder mSyncInfoBinder = new AbstractSyncInfoBinder()
{
     @Override
     public boolean isTotalSync()
     {
          // return some field that was set by your onPerformSync method
          return mCurrentSyncIsTotalSync;
     }
}

public IBinder getSyncInfoBinder()
{
    return mSyncInfoBinder
}

当然,同步适配器仍需要实现此方法(在您的情况下)可能如下所示:

Main.css

.textbox{
         font-size: 12px;
         float  : left;
         height : 197px;
         width : 650px; }


Default.html

<!DOCTYPE html>
<html> 
    <head>
        <!-- Charactor set allowed to use -->
        <meta charset="utf-8"/>

        <title>Text from .txt file to TextArea</title>

        <!-- External stylesheet -->
        <link rel="stylesheet" href="main.css" />

        <script src="https://code.jquery.com/jquery-1.10.2.js"></script>

    </head>
    <body>
       <textarea class="textbox" id="Brief" readonly></textarea>

       <script> $( "#Brief" ).load( "text.txt" ); </script>
    </body> 
</html>

当然,只有将同步适配器设置为单线程时,才能轻松实现此功能。对于多线程同步适配器,您必须采取其他步骤以确保获得所有正在进行的同步的状态。

无论如何,这是从同步适配器获取实时结果以在UI中显示它们的好方法。