1

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();
                }
            }
        }
    }
}
4

2 に答える 2

1

簡単な解決策として、 'onCreate()`の代わりにstartUdp()呼び出すことができます。onResume()

ただし、ネットワークI / Oの実行を実際にブロックする場合、Androidはメイン(UI)スレッドをブロックしているため、アプリケーションを強制終了する可能性があります。

別のスレッドでUDPリスナーを実行するか、AsyncTaskを使用して、表示目的のハンドラーを使用して、受信したUDPパケットデータをメインスレッドに渡す必要があります。

于 2012-07-12T16:19:42.133 に答える
1

UI スレッドでネットワーキングを行わず、AsyncTask などに移動します。

于 2012-07-12T14:17:18.193 に答える