0

我在这里的第一篇文章。这个网站对学习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();}

附录:

原来不是我的服务没有启动,而是音频在 2.2 中启动不够快......

当我的服务启动和停止时,我通过将我的服务的onCreate()onDestroy()方法放在它们自己的线程中来摆脱 ANR,这可能从一开始就应该是这样的?不好意思,刚学。

但是真正的问题仍然是延迟,澄清一下——

例如,当我将数据源设置为这样的 MP3 文件时,我的代码现在可以正常工作,而且在 2.1 和 2.2 中我希望它是这样的: 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.

在我的服务方法中player.stop()调用之后,停止媒体播放器也需要相同的时间,大约 25 秒,然后该方法继续 Toast 消息并取消通知。onDestroy()onDestroy()

这就是2.2的方式吗?如果是这样,我可以解决延迟问题,这不是问题。或者更有可能是我做错了什么?但它在 1.6 和 2.1 中完全符合我的要求!

发布更多代码会有所帮助吗?

我的代码非常简单。没有音频控件或类似的东西。只需一个启动音频按钮和停止音频按钮,即可启动和停止播放音频流的服务。

感谢您的任何帮助!

4

1 回答 1

1

不要prepare()从主应用程序线程调用,尤其是对于流,因为这可能比 ANR 之前允许的时间长得多。改为使用prepareAsync()。我不知道这是否是您特定问题的根源,但这肯定是您当前实施中 ANR 的原因之一。

于 2010-07-31T01:36:47.387 回答