0

我正在尝试编写一个接收数据报数据包并播放该数据包(音频数据包)的 Android 应用程序。

我想为此目的使用服务,因此音频不会中断。为此,我有这样的服务:

public class MyService extends Service {
  ... 
  AudioTrack track;
  DatagramSocket sock;
  DatagramPacket pack;
  ...

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }

  @Override
  public void onCreate() {
    ...
    track = new AudioTrack(...)
    track.play();
    sock = new DatagramSocket(AUDIO_PORT);
    pack = new DatagramPacket(...)
    ...
    }

  @Override
  public void onStart(Intent intent, int startid) {
    ...
    while(true)
    {
        try {
            sock.receive(pack);
        } catch (IOException e) {
            e.printStackTrace();
        }
        track.write(pack.getData(), 0, pack.getLength());
    }
  }
 }

在我的主要活动中,我有一个“开始”按钮,当按下它时它会运行:

startService(new Intent(this, MyService.class));

该应用程序运行良好并且可以很好地播放接收到的音频,但是在按下开始按钮后:

  1. 它不响应任何其他按钮

  2. 过了一会儿,我收到这条消息:“应用程序 MyAppName 没有响应”,它提供了两个选项ForcecloseWait. 如果我按Waitaudo 继续播放良好但 UI 不再响应。

对我来说,这似乎是造成这种情况while(true)的原因。onStart

感谢以正确方式执行此操作的任何帮助和指示。

4

1 回答 1

1

这是一个例子:

public void onStart(Intent intent, int startid) {
    ...
    Thread streamer = new Thread() {

        @Override
        public void run() {
            while(true) {
                try {
                    sock.receive(pack);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                track.write(pack.getData(), 0, pack.getLength());
            }
        }
    });
    streamer.setPriority( Thread.MAX_PRIORITY );
    streamer.start();
  }

显然,在您的代码的最终版本中,您将希望跟踪您创建的线程,以便您可以检查它的状态或终止它,和/或在线程中创建一个处理程序,以便您可以从服务中控制它.

于 2013-02-02T15:02:49.007 回答