У меня есть экземпляр MediaPlayer, который готовит сетевой поток. Пока я все еще готов, я выделяю другой экземпляр MediaPlayer и пытаюсь установить источник данных в локальный файл. setDataSource блокирует до завершения подготовки первого экземпляра MediaPlayer. Я тестировал только эмулятор. У вас есть идеи, почему это происходит? Насколько мне известно, 2 экземпляра MediaPlayer должны вести себя независимо. Спасибо.Android MediaPlayer setDataSource блокирует пока другой экземпляр MediaPlayer не завершит подготовку
Я создал небольшой тест вне моего приложения. Это код моего OnCreate метода:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button)findViewById(R.id.thebutton);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
System.out.println("555555555555555");
MediaPlayer pl2 = new MediaPlayer();
System.out.println("6666666666666");
try {
pl2.setDataSource("/mnt/sdcard/Music/ABBA/Abba - Waterloo.mp3");
System.out.println("777777777777");
pl2.prepareAsync();
System.out.println("888888888888");
} catch (IOException e) {
e.printStackTrace();
}
}
});
System.out.println("111111111111");
MediaPlayer pl1 = new MediaPlayer();
System.out.println("22222222222222");
try {
pl1.setDataSource("http://glb-stream14.streamserver.ch/1/rsc_it/aacp_64");
System.out.println("3333333333333");
pl1.prepareAsync();
System.out.println("444444444444");
} catch (IOException e) {
e.printStackTrace();
}
}
И это выход журнала:
12-28 14:59:57.478: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=net.selfip.imiklosik.tests/.MyActivity bnds=[2,155][58,214] }<br/>
12-28 14:59:57.707: INFO/System.out(342): 111111111111<br/>
12-28 14:59:57.737: INFO/System.out(342): 22222222222222<br/>
12-28 14:59:57.747: INFO/StagefrightPlayer(34): setDataSource('http://glb-stream14.streamserver.ch/1/rsc_it/aacp_64')<br/>
12-28 14:59:57.747: INFO/System.out(342): 3333333333333<br/>
12-28 14:59:57.787: INFO/System.out(342): 444444444444<br/>
12-28 14:59:58.048: INFO/ActivityManager(59): Displayed activity net.selfip.imiklosik.tests/.MyActivity: 426 ms (total 426 ms)<br/>
12-28 15:00:05.338: INFO/System.out(342): 555555555555555<br/>
**12-28 15:00:05.338**: INFO/System.out(342): 6666666666666<br/>
**12-28 15:00:18.449**: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/Music/ABBA/Abba - Waterloo.mp3')<br/>
12-28 15:00:18.449: INFO/System.out(342): 777777777777<br/>
12-28 15:00:18.449: INFO/System.out(342): 888888888888<br/>
12-28 15:00:18.467: ERROR/MediaPlayer(342): error (1, -2147483648)<br/>
12-28 15:00:18.498: ERROR/MediaPlayer(342): Error (1,-2147483648)<br/>
Первые жирный шрифт временных меток после того как я нажал на кнопку (прямо перед setDataSource вызова на второй игроке объект).
Вторая полужирная метка после завершения метода setDataSource.
Существует разница в 13 секунд, время, когда был запущен метод setDataSource (называемый совершенно другим объектом MediaPlayer, в то время как первый объект MediaPlayer - даже с подготовкойAsync) был заблокирован.
Почему это происходит? Я делаю что-то неправильно ?
Я отредактировал мой вопрос, см. Выше. –
вы применили мой ответ в своем коде, затем отредактируйте вопрос с другой ошибкой, каждый из них посвятит мой ответ .. почему это !!! – confucius
Я действительно не понимаю, что вы имеете в виду здесь. Какая еще ошибка? Это ошибка, о которой я говорил ранее (блоки setDataSource до окончания первого приготовления). И я не «применил» ваш ответ, потому что в моей программе я уже использовал метод prepareAsync. Это правда, я забыл это сказать. Кроме того, если бы я раньше работал над подготовкой, я не мог бы снова вызвать setDatasource, потому что пользовательский интерфейс был бы заблокирован. Может быть, просто из другого потока, но тогда не было бы блокировки. Пожалуйста, подождите больше. –