Я столкнулся с серьезной проблемой, когда медиаплеер (MP) зависал в методе prepare ()
.
Мое приложение запускает prepare ()
в AsyncTask
, чтобы избежать блокировки пользовательского интерфейса, поскольку источники находятся в Интернете. Есть несколько кнопок воспроизведения, которые пользователь может нажать в любое время, поэтому я добавил prepare ()
в синхронизированный метод, чтобы лучше контролировать состояние MP. Мое приложение также вызывает release ()
onPause, чтобы освободить используемые ресурсы.
Дело в том, что я заметил, что если release ()
вызывается во время подготовки, prepare ()
никогда не возвращается, и поэтому я застрял внутри синхронизированного метода. Хуже всего то, что поток AsyncTask
находится в тупике, и каждый раз, когда пользователь нажимает кнопку воспроизведения в этом состоянии, другой поток тратится впустую, поскольку он продолжает ждать, чтобы получить монитор, который владеет никогда не возвращающийся prepare ()
. Вскоре все мои потоки AsyncTasks
потрачены впустую, и, поскольку я их активно использую, мое приложение перестает работать.
Итак, мой вопрос: есть ли у кого-нибудь представление о том, как преодолеть эту проблему? Я серьезно подумываю переделать всю свою работу с MediaPlayer, но мне нужно знать, как лучше всего справляться с ситуациями, подобными этой, заранее.