Intereting Posts
Как отключить предупреждение eclipse в производном файле IMarketBillingService.java? Как выполнить запрос DELETE без типа возврата или обратного вызова? Переопределить версию Java при построении проекта Cordova с помощью градации Android WebView JellyBean -> Не должно быть: не найдены узлы проверки на основе прямой основы Как получить 2D-массив из XML-ресурса для Android? Как группировать андроидные уведомления, например whatsapp? Как приостановить Flash-контент в Android WebView, когда моя активность не отображается? Проверка EditText с помощью TextWatcher Обслуживание, которое выполняется каждую минуту Как установить Live Wallpaper автоматически каждый день в Android Socialauth android ResourceNotFound Как показать диалог предупреждения только при первом запуске моего приложения? Диалоговое взаимодействие с панелью действий Методы getViewTypeCount и getItemViewType для ArrayAdapter Панель действий Android – динамическое удаление панели действий

Обратный звонок Android SyncAdapter

Я реализовал SyncAdapter, AccountManager и частный ContentProvider в соответствии с образцом проекта SimpleSyncAdapter в SDK. Все работает хорошо.

Теперь я хочу показать сообщение пользователю, когда новые строки были загружены с удаленного сервера с определенным набором флагов. Мне нужен обратный вызов из SyncAdapter, когда синхронизация завершилась, поэтому я могу выполнить запрос и отобразить сообщение из активности. Я видел несколько вопросов о StackOverflow, которые обсуждали это, но никто не ответил на хороший ответ.

Как можно слушать прогресс от Android SyncAdapter? Говорит, что SyncStatusObserver бесполезен. Пользователь mobibob предлагает использовать ResultReceiver для ответа на пользовательский интерфейс из потока синхронизации.

Как узнать, когда синхронизация завершена? Предлагает использовать намерение в SyncService.

Как сигнализировать синхронизацию с Android SyncManager? Предлагает использовать SyncResult. Код примера, связанный с maxpower47, использует класс SyncResult для отчета об исключениях, но не для фактического сообщения о успешной завершении синхронизации.

Я просто не знаю, что является лучшим вариантом, и я не видел каких-либо примеров проектов, в которых используется какое-либо из этих решений.

Solutions Collecting From Web of "Обратный звонок Android SyncAdapter"

Я знаю, что это старый вопрос, но я сам просил об этом. То, что я нашел в качестве хорошего решения, особенно потому, что я имею дело с локальными данными, как вы, заключается в использовании следующего метода из ContentResolver:

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) 

Этот регистр регистрирует класс наблюдателя, который получает обратный вызов, когда данные, идентифицированные с помощью данного URI контента, изменяются. Но это может произойти только в том случае, если ваш ContentProvider отправит уведомление. Например, если вы хотите получить уведомление на ContentObserver выше для всех обновлений, сделанных в вашей базе данных через ContentProvider, ваш 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 обрабатывает сетевые запросы и уведомляет пользовательский интерфейс.

Сначала вы должны использовать Loaders с contentProvider, чтобы сделать вашу жизнь проще. Вам больше не нужно регистрироваться для распознавателя контента, который загрузчик делает для вас. Это означает, что ваш пользовательский интерфейс получает уведомление обо всем, что входит в ваш контент-провайдер.

Что, если ничего не изменится? Все было в курсе событий, или у вас была сетевая ошибка.

  1. Вы можете прослушивать статус вашего адаптера синхронизации, как приложение Google I / O, искать mSyncStatusObserver в BaseActivity
  2. Я посмотрел приложение электронной почты по умолчанию и Android, и они используют Singleton с callBacks.
  3. Вы можете BroadcastIntents или использовать eventBus (квадрат Отто, например), чтобы уведомить ваш пользовательский интерфейс о любом поведении.

Мне нравится последнее лучше, потому что это дает вам более подробную информацию о событиях, которые происходят в syncAdapter.

Мы столкнулись с подобной ситуацией и написали статический интерфейс Listener для SyncAdapter. Слушателем является активность и выполняет необходимые действия, когда данные доступны (обновить интерфейс). Это также работает, когда система синхронизации вызывается системой во время автосинхронизации, где этот слушатель будет пустым, а процесс синхронизации будет иметь в виду его собственный бизнес.

 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(); } 

Затем в Управлении реализуем интерфейс SyncAdapter.Listener .