Я сталкиваюсь с проблемой, когда MP "зависает" при подготовке состояния слишком долго (поток), и я пытаюсь остановить его с помощью reset ().Это приводит к зависанию MP и, таким образом, все мое приложение зависает.Похоже, нет способа остановить депутата при подготовке государства.Я думаю об использовании prepare (), обернутого в нить, а не prepareAsync ().Тогда я смогу убить эту тему.На данный момент я сделал это следующим образом:
private void actionCancel(){
try {
mp.setDataSource(new String());
} catch (Exception e) {
e.printStackTrace();
android.util.Log.d(TAG,"actionCancel(): mp.setDataSource() exception");
mp.reset();
}
}
и он работает 4me.
Кроме того, у меня есть следующий счетчик:
@Override
public void onBufferingUpdate(final MediaPlayer mp, final int percent) {
if (!mp.isPlaying()){
// android.util.Log.d(TAG,"onBufferingUpdate(): onBufferingUpdateCount = "+onBufferingUpdateCount);
if (onBufferingUpdateCount>MAX_BUFFERING_UPDATES_AT_PREPARING_STATE)
restartMP();
onBufferingUpdateCount++;
return;
}
}
я бы обнаружил, что этот слушатель всегдатриггеры при подготовке государства.Поэтому, если он срабатывает более 10 раз, а MP все еще не воспроизводится, я просто перезапускаю его:
private void restartMP(){
if (mp!=null)
if (mpState==MediaPlayerState.Preparing)
actionCancel();
else
mp.reset();
else
mp = new MediaPlayer();
mpState = MediaPlayerState.Idle;
onBufferingUpdateCount=0;
//isRequestCancelled=false;
requestTrackInfoStartedAt=0;
requestPlay();
}
note Примечание MediaPlayerState - это мое пользовательское перечисление со значением «Подготовка».Также mpState является свойством / полем класса, которое содержит текущее состояние MediaPlayerState.Перед запуском prepareAsync () я устанавливаю mpState в MediaPlayerState.Preparing после его завершения, устанавливая его в MediaPlayerState.Started или другое соответствующее значение.