1

我正在制作一个接收 UDP 消息的应用程序。我遇到的问题是显示Activity,因为它仅在收到UDP消息后显示。在onCreate我有startUdp()which 开始收听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();
                }
            }
        }
    }
}
4

2 回答 2

1

不要在 UI 线程上进行联网,将其移动到诸如 AsyncTask 之类的东西上。

于 2012-07-12T14:17:18.193 回答
1

好吧,作为一个简单的解决方案,您可以直接调用startUdp()onResume()不是“onCreate()”。

但如果它真的阻塞了网络 I/O,那么 Android 很可能会直接杀死你的应用程序,因为它阻塞了主 (UI) 线程。

您应该在单独的线程中运行 UDP 侦听器,或者使用 AsyncTask 并使用处理程序将任何接收到的 UDP 数据包数据传递给主线程以进行显示。

于 2012-07-12T16:19:42.133 回答