在收到UDP数据包之前不显示活动

时间:2012-07-11 15:56:23

标签: java android udp android-activity android-networking

我正在创建一个接收UDP消息的应用程序。我遇到的问题是显示Activity,因为它只会在收到UDP消息后显示。在onCreatestartUdp()开始收听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();
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

嗯,作为一个简单的解决方案,您只需在startUdp()中调用onResume()而不是'onCreate()`。

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

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