【问题标题】:Activity not displaying until UDP packet received在收到 UDP 数据包之前不显示活动
【发布时间】:2012-07-11 15:56:22
【问题描述】:

我正在制作一个接收 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();
                }
            }
        }
    }
}

【问题讨论】:

  • 发布代码以澄清您的问题!
  • startUdp() 会阻塞吗?
  • 您应该修正您的问题以采用更好的格式。但是,您可以使用 Log 命令查看您的代码去了哪里。 Log.e("UDP", "+++ AFTER STARTUDP +++"); 在 startUdp() 调用之后,如果程序到达那行代码,它将出现在你的 LogCat 中。
  • 它在接收 UDP 消息时在 startUDP() 内部阻塞。一旦它收到一条消息,视图的其余部分就会显示。我可以看到它在屏幕上显示任何内容之前等待接收消息。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2012-01-21
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      相关资源
      最近更新 更多