我正在创建一个接收UDP消息的应用程序。我遇到的问题是显示Activity
,因为它只会在收到UDP
消息后显示。在onCreate
我startUdp()
开始收听UDP
消息,我认为这是问题所在。
有没有办法告诉Activity
何时完成加载或我应该在哪里开始收听?
我的Activity
代码:
public class UDPActivity extends Activity {
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_UDP);
// Setup the UDP stuff
startUDP();
System.out.println( "Sent Response of ");
TextView rowLetter = (TextView) findViewById(R.id.rowLetter);
TextView seatNumber = (TextView) findViewById(R.id.seatNumber);
Button btnClose = (Button) findViewById(R.id.btnClose);
Intent i = getIntent();
// Binding Click event to Button
btnClose.setOnClickListener( new View.OnClickListener() {
public void onClick(View arg0) {
//Closing SecondScreen Activity
finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_make_light, menu);
return true;
}
private static final int UDP_SERVER_PORT = 12345;
private static final int MAX_UDP_DATAGRAM_LEN = 1500;
private void startUDP() {
Log.d("UDP", "S: Connecting...");
String lText;
byte[] lMsg = new byte[MAX_UDP_DATAGRAM_LEN];
DatagramSocket ds = null;
while (true) {
try {
ds = new DatagramSocket(UDP_SERVER_PORT);
//disable timeout for testing
//ds.setSoTimeout(100000);
DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
Log.d("UDP", "S: Receiving...");
ds.receive(dp);
lText = new String(lMsg, 0, dp.getLength());
Log.i("UDP packet received", "S: Recieved '" + lText);
textView = (TextView) findViewById(R.id.text1);
textView.setText(lText);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}
}
}
}
}
答案 0 :(得分:1)
不要在UI线程上进行联网,将其移动到诸如AsyncTask之类的东西。
答案 1 :(得分:1)
嗯,作为一个简单的解决方案,您只需在startUdp()
中调用onResume()
而不是'onCreate()`。
但是,如果它真的阻止了网络I / O,那么Android很可能会杀死你的应用程序,因为它阻止了主(UI)线程。
您应该在一个单独的线程中运行UDP侦听器,或者使用AsyncTask并使用处理程序将任何收到的UDP数据包数据传递给主线程以进行显示。