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

时间:2014-07-30 16:12:27

标签: java android multithreading

我试图发送一些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();
            }

问题是udpSocket的send方法无法在UI线程上调用,否则会抛出异常。 这些通知每20分钟到达一次,我希望一旦它们可用就通过udp发送数据,但我认为每次创建新线程都浪费资源。如何在我之前创建的工作线程上调用send方法?

2 个答案:

答案 0 :(得分:0)

使用handler.Refer代码创建一个辅助线程并将任务发布到它:

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

请参阅this了解更多信息

答案 1 :(得分:0)

你可以使用BlockingQueue只留下一个线程。锁定this示例。