Android MediaPlayer застрял в методе prepare ()

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

Дело в том, что я заметил, что если release () вызывается во время подготовки, prepare () никогда не возвращается, и поэтому я застрял внутри синхронизированного метода. Хуже всего то, что поток AsyncTask находится в тупике, и каждый раз, когда пользователь нажимает кнопку воспроизведения в этом состоянии, другой поток тратится впустую, поскольку он продолжает ждать, чтобы получить монитор, который владеет никогда не возвращающийся prepare () . Вскоре все мои потоки AsyncTasks потрачены впустую, и, поскольку я их активно использую, мое приложение перестает работать.

Итак, мой вопрос: есть ли у кого-нибудь представление о том, как преодолеть эту проблему? Я серьезно подумываю переделать всю свою работу с MediaPlayer, но мне нужно знать, как лучше всего справляться с ситуациями, подобными этой, заранее.

6
задан Mutix 14 December 2011 в 23:48
поделиться