1

Почему пример SyncService приведен ниже, используйте Service вместо IntentService? Я понимаю, что IntentServices работает в фоновом режиме, а обычный основной файл Service будет работать в основном потоке. Для чего-то без пользовательского интерфейса, который просто обновляет данные, зачем вы хотите, чтобы он запускался в основном потоке? Разве этот риск не падает?Зачем использовать Сервис через IntentService?

http://developer.android.com/training/sync-adapters/creating-sync-adapter.html#CreateSyncAdapterService

Можно ли иметь автономный IntentService? или он должен основываться на чем-то, работающем на основном потоке? Это единственная причина, по которой я могу понять, почему мы использовали бы обычный Service выше.

ответ

3

Я понимаю, что IntentServices работает в фоновом режиме, а регулярная служба будет работать в основном потоке.

Объекты не работают по темам. Способы делают.

IntentService унаследовал от Service. Основные методы жизненного цикла на Service, в частности onStartCommand(), вызываются в основной прикладной нити. IntentService помогает создать фоновый поток, который используется для вызова метода onHandleIntent(), вызванного вызовом onStartCommand().

Для чего-то без UI, который просто обновляет данные, зачем вы хотите, чтобы он запускался в основном потоке?

У вас нет.

Почему в приведенном ниже примере службы SyncService используется Служба вместо IntentService?

Потому что IntentService здесь неуместно. Составляя ссылку, связанную с:

Для этого вам необходимо создать связанный сервис, который передает специальный объект привязки Android из компонента адаптера синхронизации в фреймворк. С помощью этого объекта связующего фреймворк может вызывать метод onPerformSync() и передавать ему данные.

IntentService и шаблон привязки не работают вместе.

С точки зрения резьбы onPerformSync() is called on a background thread, поставляемый компанией Android. Следовательно, даже если IntentService не были исключены из-за привязки, вам не нужен другой фоновый поток, так как onPerformSync() уже вызывается в фоновом потоке.

+0

Спасибо. Я думаю, что моя проблема в том, что я создаю LocationListener в методе onCreate() моей службы (чтобы получить текущее местоположение пользователя), поэтому, когда вызывается onPerformSync() SyncAdapter, он использует обновленное местоположение. У вас есть лучшая идея относительно того, где я должен создать свой LocationListener (он использует сетевого провайдера и только получает текущее местоположение пользователя один раз). – ZakTaccardi

+0

@ user891242: IMHO, получение местоположения пользователя не имеет ничего общего с синхронизацией с сервером (точка «SyncAdapter»). – CommonsWare

+0

Ну, в моем приложении погоды у меня есть опция CheckboxPreference, которая позволяет пользователю использовать свое текущее местоположение для данных о погоде. Когда я поставлю флажок, я хочу, чтобы SyncAdapter синхронизировался немедленно, используя новое местоположение. Основываясь на ваших советах, я асинхронно получаю новое местоположение с помощью IntentService, а затем вызываю службу SyncAdapter при получении нового местоположения. – ZakTaccardi