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());
    }
  }
 }

私の主な活動には、「START」ボタンがあり、押すと実行されます。

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

アプリは正常に動作し、受信したオーディオを適切に再生しますが、開始ボタンを押した後:

  1. 他のボタンには反応しません

  2. しばらくすると、「アプリケーション MyAppName が応答していません」というメッセージが表示され、2 つのオプションForcecloseWait. 私が押すWaitと、オーディオはうまく再生され続けますが、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 に答える