我有一个正在接收数据包的UDPServer,代码在下面。基本上当收到数据包时会发生什么,切换按钮应该被打开。确实如此,但只有在我旋转手机或按菜单按钮时才会更新视图。我认为这是由于视图没有被重新绘制。我也觉得这与事实有关,我正在使用一个线程,并且这是一个无限循环,不知何故,UI线程永远不会看到invalidate()来刷新视图。 UDPServer应该使用异步任务吗?不确定这是否是实现UDPServer的最佳方式。
public class UDPServer extends Thread {
public static final int SERVERPORT = 4444;
private boolean isRunning = false;
private String lastMessage = "";
/**
* Method to send the messages from server to client
*
* @param message
* the message sent by the server
*/
public void sendMessage(String message) {
}
@Override
public void run() {
super.run();
isRunning = true;
String message;
byte[] lmessage = new byte[4096];
DatagramSocket socket = null;
DatagramPacket packet = new DatagramPacket(lmessage,
lmessage.length);
// Let the server continue to listen for incoming packets
// Will listen on localhost and port 4444 for now
while (isRunning) {
try {
InetAddress serverAddr = InetAddress
.getByName("192.168.1.107");
socket = new DatagramSocket(SERVERPORT, serverAddr);
socket.receive(packet);
ToggleButton tglBtn = (ToggleButton) findViewById(R.id.toggleButton1);
tglBtn.setChecked(true);
// Get the data from the packet and react accordingly
message = new String(lmessage, 0, packet.getLength());
lastMessage = message;
runOnUiThread(updateTextMessage);
// processMessage(message);
myView.invalidate();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
您应该考虑使用AsyncTask
;它就是为此而开发的。您在doInBackground()
执行长时间运行的任务,该任务在后台Thread
上运行,然后更新onPostExecute()
中的用户界面,该用户界面在用户界面Thread
上运行并获得结果从doInBackground()
返回。
答案 1 :(得分:0)
要从非ui主题获取invalidate视图,您可以使用postInvalidate()。