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
}
Конечно, это работает только в том случае, если ваш адаптер синхронизации настроен на однопоточность. Для многопоточных адаптеров синхронизации вы должны предпринять дополнительные шаги, чтобы убедиться, что вы получаете статус всех текущих синхронизаций.
В любом случае это приятный способ получить живые результаты от адаптера синхронизации, чтобы представить их в пользовательском интерфейсе.
Привет, Мартен, это действительно очень приятное решение, спасибо +1! Я удивлен тем, что со всеми усилиями, предпринятыми Google в реализации архитектуры ContentProvider/SyncAdapter, она не предоставляла API для выполнения всего, что мне нужно, это очень распространенный сценарий! –
Я думаю, что архитекторы Android сделали блестящую работу при разработке материалов для сервисов/действий/трансляций, и я часто удивляюсь, что могу охватить так много вариантов использования, как, например, выше. Этот подход на самом деле намного лучше для этой цели, чем может быть просто решение на основе ContentProvider, поскольку оно дает вам гораздо больший контроль. Это фактически позволяет вам обмениваться обоими способами с нитью адаптера синхронизации во время синхронизации. – Marten
Здравствуйте, не могли бы вы рассказать мне, как получить результат «isTotalSync» в вашей деятельности? Большое спасибо –