Приведет ли служба IntentService к проблеме параллелизма с активностью

Я читал, что IntentService создает рабочий поток для выполнения работы. Если я правильно понимаю, то это означает, что работа будет выполняться в потоке, отличном от потока пользовательского интерфейса. мой вопрос

если моя активность пытается обновить общие настройки, а эта служба намерений также обновляет общие настройки, это означает, что я столкнусь с проблемой параллелизма. Правильный? Так что я лучше пользовательский сервис, а не IntentService, поскольку он работает в основном потоке пользовательского интерфейса.

Пожалуйста, подтвердите, правильно ли я понимаю


person Snake    schedule 09.02.2015    source источник


Ответы (1)


Я читал, что IntentService создает рабочий поток для выполнения работы. Если я правильно понимаю, то это означает, что работа будет выполняться в потоке, отличном от потока пользовательского интерфейса.

Правильный.

если моя активность пытается обновить общие настройки, а эта служба намерений также обновляет общие настройки, это означает, что я столкнусь с проблемой параллелизма. Правильный?

Насколько я знаю, SharedPreferences является потокобезопасным. Таким образом, это будет немного зависеть от того, что обновляют эти два компонента. Если они обновляют значения под отдельными ключами, AFAIK, вы должны быть в порядке. Однако, если они могут изменять значения для одних и тех же ключей, у вас могут возникнуть проблемы (грязные чтения и так далее).

Так что я лучше пользовательский сервис, а не IntentService, поскольку он работает в основном потоке пользовательского интерфейса.

В Java объекты не «запускаются» в потоках. Методы работают в потоках. Следовательно, служба не запускается «в основном потоке пользовательского интерфейса». Методы жизненного цикла для всех служб (например, onCreate(), onStartCommand()) вызываются в основном потоке приложения. Это включает IntentService. IntentService имеет встроенную реализацию onStartCommand(), которая направляет Intent в фоновый поток.

Кроме того, не выполняйте дисковый ввод-вывод в основном потоке приложения, включая запись в SharedPreferences.

Если вы можете записывать одни и те же ключи в SharedPreferences из нескольких потоков, используйте методы параллельного программирования. Многопоточность в Java существует примерно столько же, сколько и Java, и написано о том, как правильно выполнять параллельное программирование на Java.

person CommonsWare    schedule 09.02.2015
comment
Как всегда хорошо объяснил - person Marcus; 10.02.2015
comment
Действительно отличное объяснение, как обычно. Спасибо @CommonsWare - person Snake; 10.02.2015