2013-03-27 4 views
12

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

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

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

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

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

+0

readh ere http://stackoverflow.com/questions/8915618/mediaplayer-in-separate-thread-vs-running-in-service-via-startforeground –

+1

Я бы определенно советовал не делать никаких блокирующих звонков в Audiomanager , MediaPlayer, AudioRecord и др. Из основного потока вашего приложения. Если аудиосистема временно увязнет - или полностью перестает отвечать - по какой-то причине вы просто получите ANR в своем приложении и отчет об ошибке, который вряд ли будет полезен для всех. – Michael

+0

Спасибо за ваш ответ @Michael! Я полностью согласен с вами в том, что блокирующие вызовы должны запускаться в отдельном потоке. Но должен ли я ожидать, что воспроизведение мультимедиа станет блокирующим? Я просто не могу найти способ сказать, становится ли медиаплеер «блокирующим» или тем, что вызывает это. Это происходит только тогда, когда я транслируюсь по rtsp во время поездки на машине или поезде. Возможно, смена башни ячеек может быть проблемой? В настоящее время я полагаюсь на MediaPlayer, чтобы решить это, что делает большую часть времени. – smult

ответ

-2

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

+1

Вы не хотите, чтобы ваш медиаплеер был активен, так как он должен работать, даже если активность уничтожена. Вы должны запустить его на переднем плане. – smult

0

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

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

12

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

Смежные вопросы