1

我正在尝试在 Android 中创建客户端。该客户端运行一个创建客户端套接字的线程并启动另一个始终侦听套接字以接收字符串的线程。当我从客户端向运行在 PC 中的 Java 服务器发送字符串时,一切正常,但是当我从服务器向 Android 客户端发送字符串时,应用程序完成。为什么我会收到此错误?

下面是客户端主Activity的代码:

    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 回答