【问题标题】:Android: Force close when reading from SocketAndroid:从套接字读取时强制关闭
【发布时间】:2012-12-06 16:01:31
【问题描述】:

我正在尝试在 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());
            }
        }
    }

【问题讨论】:

  • Why do I get this error? 是什么错误?发布您的日志猫

标签: android sockets forceclose


【解决方案1】:

很难说没有看到您的 logcat 输出,但我敢打赌这是因为您正试图从后台线程中修改 UI。 ThreadLectura内的这一行:

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

可能是问题所在,因为chatHistorialTextView。您只需要在主 UI 线程中修改 UI。

【讨论】:

  • 谢谢,看来这就是问题所在。如果我删除该行,我不会收到错误消息,但现在我需要编辑 TextView 的文本。每次收到字符串时,如何从主 UI 线程编辑其文本?
  • 您有几个选择。第一种是使用Handler,这样您就可以从后台线程向处理程序发送一条消息,它会在其handleMessage 方法中执行UI 更新。您的另一个选择是删除您的Thread 代码并将其替换为AsyncTask。然后,您将在 onPostExecute 中执行您的 UI 更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
相关资源
最近更新 更多