1

Androidでクライアントを作ろうとしています。このクライアントは、クライアント ソケットを作成するスレッドを実行し、ソケットを常にリッスンして文字列を受信する別のスレッドを起動します。クライアントから PC で実行されている Java サーバーに String を送信するとすべて問題ありませんが、サーバーから Android クライアントに String を送信するとアプリが終了します。なぜこのエラーが発生するのですか?

クライアントのメイン アクティビティのコードは次のとおりです。

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.Socket;

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

    public class MainActivity extends Activity {
        TextView chatHistorial;
        EditText msg;
        Socket client;
        DataInputStream in;
        DataOutputStream out;
        Boolean cerrar;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            Thread t = new Thread(new Runnable(){
                @Override
                public void run() {
                    try{
                        client = new Socket("192.168.1.33", 4444);
                        in = new DataInputStream(client.getInputStream());
                        out = new DataOutputStream(client.getOutputStream());
                        cerrar = false;

                        chatHistorial = (TextView) findViewById(R.id.chatHistorial);
                        msg = (EditText) findViewById(R.id.msg);

                        ThreadLectura tl = new ThreadLectura(in, cerrar, chatHistorial);
                        tl.start();
                    }
                    catch(Exception e){
                        // ...
                    }
                }
            });

            t.start();

            findViewById(R.id.enviar).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String cadena = msg.getText().toString();
                    try {
                        out.writeUTF(cadena);
                    } catch (IOException e) {
                        // ...
                    }
                    if(cadena.equals("exit"))
                        cerrar = true;
                }
            });
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            //getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }

    }

    class ThreadLectura extends Thread{
        DataInputStream in;
        String cadena;
        TextView chatHistorial;
        Boolean cerrar;

        public ThreadLectura(DataInputStream in, Boolean cerrar, TextView tv){
            this.in = in;
            this.cerrar = cerrar;
            chatHistorial = tv;
        }

        @Override
        public void run(){
            try{
                while(!cerrar){
                    cadena = in.readUTF();
                    chatHistorial.append("Has recibido: " + cadena);
                }
            }
            catch(IOException ioe){
                System.out.println("Error de entrada/salida: "+ioe.getMessage());
            }
        }
    }
4

1 に答える 1

2

logcat の出力を見ずに言うのは難しいですが、バックグラウンド スレッド内から UI を変更しようとしているためだと思います。内のこの行ThreadLectura

chatHistorial.append("Has recibido: " + cadena);

と同様に、おそらく問題chatHistorialですTextView。メイン UI スレッド内からのみ UI を変更する必要があります。

于 2012-12-06T16:13:18.087 に答える