Задержка носителя в 2.2 после настройки источника данных? - PullRequest
0 голосов
/ 29 июля 2010

Мой первый пост здесь.Этот сайт был очень полезен для изучения программирования на Android, спасибо всем.

У меня есть простое приложение, которое загружает поток MP3 и воспроизводит его.Он отлично работает на 1.6 и 2.1, но на 2.2 он работает не совсем правильно.Кажется, у моего сервиса проблема с запуском, он дает мне ANR и диалоговое окно, где я должен нажать «Ждать», и, наконец, сервис запускается.Почему запуск сервиса занимает много времени?

Вот мой простой код, который устанавливает источник и воспроизводит звук:

    public class MyActivityService extends Service {

 MediaPlayer player = new MediaPlayer();

 @Override
 public IBinder onBind(Intent intent) {
  return null;
 }
 @Override
 public void onCreate() {  
  super.onCreate();   

  try {

   player.setDataSource("URL OF MUSIC FILE");
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalStateException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

  try {

   player.prepare();
   player.setVolume(1, 1);
      player.setLooping(true);           
      player.start();                   

   Toast.makeText(getApplicationContext(), "Audio Service Started.", Toast.LENGTH_SHORT).show();}

ADDENDUM:

Оказывается, это не был мой сервис, который не запускался, это аудио, которое не запускается достаточно быстро в 2.2 ...

Я избавился от ANR, когда мой сервис запускался и останавливался, поставив onCreate() и onDestroy() методы моего сервиса в собственных потоках, что, вероятно, так и должно было быть с самого начала?Извините, только учусь.

Но задержка, которая является настоящей проблемой, остается уточнить -

Например, мой код, как он есть сейчас, работает отлично, и как яхотите, чтобы это было в 2.1 И 2.2, когда я устанавливаю источник данных в MP3-файл, например, так: http://dl.dropbox.com/u/6916184/TestSongStream.mp3

НО, когда я устанавливаю источник данных в местоположение аудиопотока, например: http://d.liveatc.net/kjfk_twr или это: http://relay.radioreference.com:80/192236577 работает правильно ТОЛЬКО в 2.1.

В 2.2 звук в конце концов начинает воспроизводиться, но «StagefrightPlayer» занимает около 25 секунд или около того после настройки источника данных, пока звук не запустится, как показано здесь:

07-31 02:54:30.176: INFO/StagefrightPlayer(34): setDataSource('http://relay.radioreference.com:80/192236577')
07-31 02:54:55.228: INFO/AwesomePlayer(34): calling prefetcher->prepare()
07-31 02:54:56.231: INFO/Prefetcher(34): [0x2cc28] cache below low water mark, filling cache.
07-31 02:54:56.337: INFO/AwesomePlayer(34): prefetcher is done preparing
07-31 02:54:56.347: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12
07-31 02:54:57.337: ERROR/AwesomePlayer(34): Not sending buffering status because duration is unknown.

Это такжеОстановка медиапроигрывателя занимает примерно 25 секунд после вызова player.stop() в методе onDestroy() моего сервиса, а метод onDestroy() продолжает выводить сообщение и отменять уведомление.

Это так же, как с 2.2?Если так, я могу обойти задержки, это не проблема.Или, скорее, я что-то не так делаю?Но это работает именно так, как я хочу в 1.6 и 2.1!

Поможет ли публикация большего количества кода?

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

Спасибо за любую помощь!

1 Ответ

1 голос
/ 31 июля 2010

Не вызывайте prepare() из основного потока приложения, особенно для потока, потому что это может занять гораздо больше времени, чем разрешено до ANR.Вместо этого используйте prepareAsync().Я понятия не имею, является ли это корнем вашей конкретной проблемы, но это, безусловно, будет одной из причин ANR в вашей текущей реализации.

...