我试图发送一些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方法?
答案 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示例。