我最近编写了一个小型的Android应用程序来通过本地网络发送和接收UDP消息。
我有一个UDP接收器线程运行来监听UDP数据包,我想要发生的是一个按钮当收到包含特定数据字符串的数据包时,在UI上启用。我知道这必须通过一个处理程序来完成,问题在于我对线程有很少的了解,而且对处理程序知之甚少。
有人能够阐明如何将处理程序放入我的代码中吗?
感谢
代码:
public void startUDPlistener() {
// Creates the listener thread
LISTEN = true;
Thread listenThread = new Thread(new Runnable() {
@Override
public void run() {
try {
Log.i(LOG, "Listener started!");
DatagramSocket socket = new DatagramSocket(BROADCASTPORT);
socket.setSoTimeout(1500);
byte[] buffer = new byte[BUFFERSIZE];
DatagramPacket packet = new DatagramPacket(buffer, BUFFERSIZE);
while(LISTEN) {
try {
Log.i(LOG, "Listening for packets");
socket.receive(packet);
String data = new String(buffer, 0, packet.getLength());
Log.i(LOG, "UDP packet received from "+ packet.getAddress() +" packet contents: " + data);
}
catch(IOException e) {
Log.e(LOG, "IOException in Listener " + e);
}
}
Log.i(LOG, "Listener ending");
socket.disconnect();
socket.close();
return;
}
catch(SocketException e) {
Log.e(LOG, "SocketException in Listener " + e);
}
}
});
listenThread.start();
}
答案 0 :(得分:1)
您基本上只需添加一个并发送Message
或Runnable
。
private final Handler mUiThreadHandler = new Handler(Looper.getMainLooper());
void fromAnyThread() {
final String importantDataFromBackGroundThread = "!!!";
mUiThreadHandler.post(new Runnable() {
@Override
public void run() {
System.out.println("Hi from Ui Thread:" + importantDataFromBackGroundThread);
}
});
}
Handler
处理它运行的Thread中的所有消息/ runnable。如果指定Looper.getMainLooper()
,则保证这是主线程。