Должен ли MediaPlayer работать в отдельном потоке?

Я создаю приложение, которое передает музыку с веб-сервера. Приложение имеет переднюю службу, которая использует MediaPlayer для воспроизведения.

Мой код основан на этом примере: http://developer.android.com/guide/topics/media/mediaplayer.html

В этом примере ничего не пронизывается, кроме вызова prepareAsync(). Меня смущает то, что когда я читаю о классе службы, я нахожу эту информацию:

"Внимание: служба работает в основном потоке своего хостинга - служба не создает свой собственный поток и не запускается в отдельном процессе (если вы не указали иначе). Это означает, что, если ваша служба идет (например, воспроизведение MP3 или сетевое взаимодействие), вы должны создать новый поток в службе для выполнения этой работы. Используя отдельный поток, вы уменьшите риск приложения не реагировать (ANR) ошибки и основной поток приложения могут оставаться посвященными взаимодействию пользователя с вашими действиями".

Причина, по которой я спрашиваю, заключается в том, что приложение несколько раз (обычно при прекращении соединения) задерживает пользовательский интерфейс при потоковой передаче звука. Я полностью понимаю, что пользовательский интерфейс зависает, если служба делает интенсивную работу ЦП, поскольку активность и служба работают в одном потоке. Но должен ли я ожидать, что MediaPlayer будет настолько интенсивным? То есть, если он запускается в отдельном потоке?

Ответ 1

К сожалению, вызов prepareAsync() просто недостаточно хорош, чтобы избежать запросов ANR и приложения, зависающих на несколько секунд, особенно если вы играете файл из сети. Лучше всего поставить ваш экземпляр MediaPlayer в свой собственный поток или, по крайней мере, выполнить интенсивные вызовы в обработчике (например, mediaplayer.start()). Я использую MediaPlayer уже более года, и могу сказать, что он определенно зависает после различных вызовов, в зависимости от обстоятельств.

Ответ 2

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

Я не эксперт и в настоящее время изучаю себя, но об этом стоит подумать.

Ответ 3

Нет, если вы делаете какую-либо сетевую передачу, вы должны сохранить это в потоке, медиаплеер не является ресурсоемким. Держите его в своей деятельности.