繁体   English   中英

如何从特定线程发送udp数据报?

[英]How can I send udp datagrams from a specific thread?

我正在尝试发送一些udp数据报,其中包含通过AudioRecord类记录的编码音频样本。 当经过一定时间的记录并可以安全使用记录的数据时,此android类提供通知。

audioRecorder.setRecordPositionUpdateListener(new AudioRecord.OnRecordPositionUpdateListener() {

            @Override
            public void onPeriodicNotification(AudioRecord recorder) {
...

当数据可用时,我需要像这样通过udp发送数据:

audioRecorder.setRecordPositionUpdateListener(new AudioRecord.OnRecordPositionUpdateListener() {

            @Override
            public void onPeriodicNotification(AudioRecord recorder) {

                byte[] pcm = new byte[320];
                recorder.read(pcm, 0, 320);

                mapPcm16bitLittleEndian2Float(pcm, 0, rawData, 0, 320/2);
                final byte encoded[]=encode(rawData);

                Thread t = new Thread(new Runnable() {
                    public void run() {
                        DatagramPacket p = new DatagramPacket(encoded, encoded.length, serverIPAddress, 5010);
                        try {
                            udpSocket.send(p);
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    };
                });
                t.start();
            }

问题是不能在UI线程上调用udpSocket的send方法,否则会引发异常。 这些通知每20毫秒发送一次,我想在数据可用时立即通过udp发送数据,但我认为每次创建一个新线程都浪费资源。 如何管理先前创建的工作线程上的send方法?

创建一个辅助线程并使用handler向其发布任务,请参考以下代码:

public class MainActivity extends Activity {
TextView txt;
// our handler
 Handler handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
//display each item in a single line
  txt.setText(txt.getText()+"Item "+System.getProperty("line.separator"));
     }
 };

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  txt=(TextView)findViewById(R.id.txt);
 }

 @Override
 protected void onStart() {
  super.onStart();
              // create a new thread
  Thread background=new Thread(new Runnable() {

   @Override
   public void run() {
    for(int i=0;i<10;i++)
    {
     try {
      Thread.sleep(1000);        b.putString("My Key", "My Value: 

"+String.valueOf(i));
// send message to the handler with the current message handler          

handler.sendMessage(handler.obtainMessage());
     } catch (Exception e) {
      Log.v("Error", e.toString());
     }
    }
   }
  });

  background.start();
 }
}

请参阅以获得更多信息

使用BlockingQueue只能保留一个线程。 锁定示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM