0

AndroidおよびJavaプログラミングは初めてです。私は将来、魔女がいくつかのアンドロイド開発を含むより大きなプロジェクトをしなければなりません。だから私はいくつかのビデオチュートリアルを見てきましたが、今は自分自身を訓練するためにいくつかのアプリを実行しようとしています. 現在、UDP を使用して 2 つの Android デバイス (Motorola Defy と Samsung Galaxy Tab 2 7.0) の間でチャット サービスを作成したいと考えています。

両方のデバイスのコードは次のとおりです。

 import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetAddress;
 import java.net.SocketException;
 import java.net.UnknownHostException;

 import android.app.Activity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;

 public class udpserver extends Activity implements View.OnClickListener {

Button Send;
EditText IPAdresse;
EditText TEXT;
TextView RXtext,tstep,rstep;
private static final int TIMEOUT_MS = 1000;
private static final int server_port = 13011;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.udpserver);

    IPAdresse = (EditText) findViewById(R.id.etIPAdresse);
    TEXT = (EditText) findViewById(R.id.etTEXT);
    Send = (Button) findViewById(R.id.bSendaa);
    RXtext = (TextView) findViewById(R.id.tvRXtext);
    tstep = (TextView) findViewById(R.id.tvTstep);
    rstep = (TextView) findViewById(R.id.tvRstep);
    Send.setOnClickListener(this);


    String text;
    byte[] message = new byte[1500];
    DatagramSocket s;


    //while(true){
    try {
        s= new DatagramSocket(server_port);
                                                    rstep.setText("1");
        s.setBroadcast(true);
                                                    rstep.setText("2");
        s.setSoTimeout(TIMEOUT_MS);
                                                    rstep.setText("3");
        while(true){
        DatagramPacket p = new DatagramPacket(message, message.length);
                                                    rstep.setText("4");
        //InetAddress test = InetAddress.getByName("192.168.1.101");
            //                                      rstep.setText("5");
        //s.connect(test,12345);
            //                                      rstep.setText("6");
        s.receive(p);
                                                    rstep.setText("xxx");

        text = new String(message, 0, p.getLength());
        RXtext.setText(text);
        }
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        rstep.setText("fail socket create");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        rstep.setText("fail receive");
    }

    }
//}






public void onClick(View arg0) {
    // TODO Auto-generated method stub
    switch(arg0.getId()){
    case R.id.bSendaa:
                                                                tstep.setText("1");
        String messageStr= TEXT.getText().toString();
                                                                tstep.setText("2");

        DatagramSocket s;
        try {
            s = new DatagramSocket();
                                                                tstep.setText("3");
            s.setBroadcast(true);
                                                                tstep.setText("4");
            s.setSoTimeout(TIMEOUT_MS);
                                                                tstep.setText("5");
            InetAddress local = InetAddress.getByName(IPAdresse.getText().toString());
                                                                tstep.setText("6");
            int msg_length=messageStr.length();
                                                                tstep.setText("7");
            byte[] message = messageStr.getBytes();
                                                                tstep.setText("8");
            DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port);
                                                                tstep.setText("9");
            s.connect(local,server_port);
                                                                tstep.setText("10");
            s.send(p);
                                                                tstep.setText("sending complete");


        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            tstep.setText("sending failed");
        }



    }
}

}

私のUIは次のようになります(翻訳あり)

ここに画像の説明を入力

私の問題は次のとおりです。アクティビティの開始時に1秒しか受信できません(1秒= TIMOUT_MS)。でもずっと受けたい。while(true) loop を使用しようとしましたが、アプリは常にクラッシュします。

前もって感謝します!!!(そして私の英語で申し訳ありません、私はそれが最高ではないことを知っています:))

4

1 に答える 1

0

while(true) を実行すると、無限ループに陥ります。それがあなたのアプリがクラッシュする理由です。必要なことは、s.receive(p) を実行する新しいスレッドを開始することです。何かのようなもの:

new Thread(new Runnable() {
     public void run() {

       while(true){
        DatagramPacket p = new DatagramPacket(message, message.length);
                                                    rstep.setText("4");
        //InetAddress test = InetAddress.getByName("192.168.1.101");
            //                                      rstep.setText("5");
        //s.connect(test,12345);
            //                                      rstep.setText("6");
        s.receive(p);
                                                    rstep.setText("xxx");

        text = new String(message, 0, p.getLength());
        runOnUiThread(new Runnable() {

        @Override
        public void run() {
          RXtext.setText(text);
        }
    });

                }
}).start();
于 2012-07-25T13:04:40.450 に答える