Я создаю приложение, которое передает музыку с веб-сервера. Приложение имеет переднюю службу, которая использует MediaPlayer для воспроизведения.Должен ли MediaPlayer запускаться в отдельном потоке?
Мой код основан на следующем примере: http://developer.android.com/guide/topics/media/mediaplayer.html
В примере, ничего не ввинчен кроме вызова prepareAsync(). Меня смущает то, что когда я читаю о классе обслуживания, я нахожу эту информацию:
«Внимание: служба работает в основном потоке своего хостинга - служба не создает свой собственный поток и не запускается в отдельный процесс (если вы не указали иначе). Это означает, что если ваша служба будет выполнять любую интенсивную работу или блокировку процессора (например, воспроизведение MP3 или сетевое взаимодействие), вы должны создать новый поток в службе для выполнения этой работы Используя отдельный поток, вы уменьшите риск ошибок приложения, не отвечающих (ANR), и основной поток приложения может оставаться посвященным взаимодействию пользователя с вашими действиями ».
Причина, по которой я прошу, заключается в том, что приложение несколько раз (обычно при прекращении соединения) замораживает пользовательский интерфейс при потоковой передаче звука. Я полностью понимаю, что пользовательский интерфейс зависает, если служба делает интенсивную работу ЦП, поскольку активность и служба работают в одном потоке. Но должен ли я ожидать, что MediaPlayer будет настолько интенсивным? То есть, если он запускается на отдельном потоке?
readh ere http://stackoverflow.com/questions/8915618/mediaplayer-in-separate-thread-vs-running-in-service-via-startforeground –
Я бы определенно советовал не делать никаких блокирующих звонков в Audiomanager , MediaPlayer, AudioRecord и др. Из основного потока вашего приложения. Если аудиосистема временно увязнет - или полностью перестает отвечать - по какой-то причине вы просто получите ANR в своем приложении и отчет об ошибке, который вряд ли будет полезен для всех. – Michael
Спасибо за ваш ответ @Michael! Я полностью согласен с вами в том, что блокирующие вызовы должны запускаться в отдельном потоке. Но должен ли я ожидать, что воспроизведение мультимедиа станет блокирующим? Я просто не могу найти способ сказать, становится ли медиаплеер «блокирующим» или тем, что вызывает это. Это происходит только тогда, когда я транслируюсь по rtsp во время поездки на машине или поезде. Возможно, смена башни ячеек может быть проблемой? В настоящее время я полагаюсь на MediaPlayer, чтобы решить это, что делает большую часть времени. – smult