2016-02-02 4 views
1

У меня есть следующий сценарий.Android SyncAdapter: как получить уведомление о конкретной синхронизации произошло

Я использую SyncAdapter в своем приложении для загрузки данных с сервера.

Когда пользователь открывает приложение, я вызываю requestSync(), чтобы убедиться, что последние данные доступны.

Когда пользователь запрашивает его, я снова вызываю requestSync(), передавая пакет определенной привязки, которую хочу загрузить.

Проблема заключается в следующем:

я могу использовать SyncStatusObserver, чтобы получить уведомление о статусе загрузки, но это не будет сказать мне, какая синхронизация завершена:

Например:

  • при запуске приложения я начать "Total" синхронизации,

  • , то пользователь запрашивает обновление на конкретную данности, поэтому я запускаю «Specific синхронизации базовой обув»,

  • SyncStatusObserver скажет мне, что синхронизация в ожидании/активным, но не скажет если это «Total» синхронизации или «Specific синхронизация нулевой точки Foo»

Как я могу это сделать?

Является ли намерение вещанием единственным способом?

ответ

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 
} 

Конечно, это работает только в том случае, если ваш адаптер синхронизации настроен на однопоточность. Для многопоточных адаптеров синхронизации вы должны предпринять дополнительные шаги, чтобы убедиться, что вы получаете статус всех текущих синхронизаций.

В любом случае это приятный способ получить живые результаты от адаптера синхронизации, чтобы представить их в пользовательском интерфейсе.

+0

Привет, Мартен, это действительно очень приятное решение, спасибо +1! Я удивлен тем, что со всеми усилиями, предпринятыми Google в реализации архитектуры ContentProvider/SyncAdapter, она не предоставляла API для выполнения всего, что мне нужно, это очень распространенный сценарий! –

+0

Я думаю, что архитекторы Android сделали блестящую работу при разработке материалов для сервисов/действий/трансляций, и я часто удивляюсь, что могу охватить так много вариантов использования, как, например, выше. Этот подход на самом деле намного лучше для этой цели, чем может быть просто решение на основе ContentProvider, поскольку оно дает вам гораздо больший контроль. Это фактически позволяет вам обмениваться обоими способами с нитью адаптера синхронизации во время синхронизации. – Marten

+0

Здравствуйте, не могли бы вы рассказать мне, как получить результат «isTotalSync» в вашей деятельности? Большое спасибо –