Android Socket UI错误

时间:2014-03-26 20:46:35

标签: java android sockets

我的同学和我正在尝试设计一款新应用,但我们遇到了问题 我们正尝试通过套接字将Raspberry与手机连接以发送消息。我们已经编辑了一些来自互联网的代码,以便适合我们的应用程序(该代码工作正常)。我们还没有做太多改变,但我们不知道为什么它不工作,即使方法和一切都是一样的。我找错了,但没有成功。我一直在阅读有关异步任务的内容,但我写的其他代码也没有用。我发布了我正在研究的两个类的方法。

我们希望当从布局按钮调用方法enviar()从ListView获取信息时,将所有内容放入字符串中,打开套接字,发送消息并关闭套接字。字符串的一部分完全正常,但是当它调用其他类时#&方法引发了一个我们不知道如何解决的异常。

注意:println-s是我们调试应用程序的特殊方式。请不要打我们,

以下是代码:

方法enviar

public void enviar(View view){
    // get the row the clicked button is in
    int i = 0;
    String eskaera="";
    Sockettest sckt = new Sockettest();

    //Conectar
    boolean conectstatus = sckt.Connect();
    if (conectstatus) {//mostramos mensaje 
        System.out.println("Conexion OK ");

    } else {//error al conectarse 
        //mostramos msg de error
        System.out.println("Error.. ");
    }

    while (i < obtenerItems().size()) {
        ListView lv = (ListView)findViewById(R.id.listViewBokatas);
        LinearLayout lerroa = (LinearLayout) lv.getChildAt(i);
        TextView bokata = (TextView) lerroa.getChildAt(0);
        EditText kantitatea = (EditText) lerroa.getChildAt(2); 
        int balioa = Integer.parseInt(kantitatea.getText().toString());
        if (balioa != 0) {
            eskaera+=balioa + " X " + bokata.getText().toString() +"\n";
        }
        i++;
    }
    System.out.println(eskaera);
    sckt.Snd_txt_Msg(eskaera);
    sckt.Disconnect();
    //return eskaera;
}

Class Sockettest

public class Sockettest  {
/** Called when the activity is first created. */

Socket miCliente;

ObjectOutputStream oos;
ObjectInputStream ois;
Mensaje_data mdata;



//Conectamos
public boolean Connect()  {
    //Obtengo datos ingresados en campos
    String IP = "viserion.no-ip.biz";
    int PORT = Integer.valueOf("5555");


    try {//creamos sockets con los valores anteriores
        System.out.println("ERROR DE LOS GORDOS0");
        miCliente = new Socket("viserion.no-ip.biz", 5555);
        System.out.println("ERROR DE LOS GORDOS2");
        //si nos conectamos
        if (miCliente.isConnected() == true) {
            return true;
        } else {
            System.out.println("ERROR DE LOS GORDOS");
            return false;
        }
    } catch (Exception e) {
        //Si hubo algun error mostrmos error
        System.out.println("ERROR DE LOS GORDOS3");
        Log.e("Error connect()", "" + e);
        return false;
    }
}

//Metodo de desconexion
public void Disconnect() {
    try {
        //Prepramos mensaje de desconexion
        Mensaje_data msgact = new Mensaje_data();
        msgact.texto = "";
        msgact.last_msg = true;
        //avisamos al server que cierre el canal
        boolean val_acc = Snd_Msg(msgact);

        if (!val_acc) {//hubo un error
            System.out.println(" Error  ");
            Log.e("Disconnect() -> ", "!ERROR!");

        } else {//ok nos desconectamos
            System.out.println("Desconectado");
            //camibmos led a rojo
            Log.e("Disconnect() -> ", "!ok!");
            //cerramos socket   
            miCliente.close();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}



//Envio mensaje de texto 
public void Snd_txt_Msg(String txt) {

    Mensaje_data mensaje = new Mensaje_data();
    //seteo en texto el parametro  recibido por txt
    mensaje.texto = txt;
    //no es el ultimo msg
    mensaje.last_msg = false;
    //mando msg
    boolean val_acc = Snd_Msg(mensaje);
    //error al enviar
    if (!val_acc) {
        System.out.println(" Error  ");
        Log.e("Snd_txt_Msg() -> ", "!ERROR!");
    }
}

/*Metodo para enviar mensaje por socket
 *recibe como parmetro un objeto Mensaje_data
 *retorna boolean segun si se pudo establecer o no la conexion
 */
public boolean Snd_Msg(Mensaje_data msg) {

    try {
        //Accedo a flujo de salida
        oos = new ObjectOutputStream(miCliente.getOutputStream());
        //creo objeto mensaje
        Mensaje_data mensaje = new Mensaje_data();

        if (miCliente.isConnected())// si la conexion continua
        {
            //lo asocio al mensaje recibido
            mensaje = msg;
            //Envio mensaje por flujo
            oos.writeObject(mensaje);
            //envio ok
            return true;

        } else {//en caso de que no halla conexion al enviar el msg
            System.out.println("Error...");//error
            return false;
        }

    } catch (IOException e) {// hubo algun error
        Log.e("Snd_Msg() ERROR -> ", "" + e);

        return false;
    }
}
}

LogCat

03-26 21:48:45.636: I/System.out(27379): ERROR DE LOS GORDOS0
03-26 21:48:45.636: I/System.out(27379): ERROR DE LOS GORDOS3
03-26 21:48:45.636: E/Error connect()(27379): android.os.NetworkOnMainThreadException
03-26 21:48:45.636: I/System.out(27379): Error.. 
03-26 21:48:45.676: I/System.out(27379): 3 X Bacon-Queso
03-26 21:48:45.676: I/System.out(27379): 1 X Jamaica
03-26 21:48:45.676: D/AndroidRuntime(27379): Shutting down VM
03-26 21:48:45.676: W/dalvikvm(27379): threadid=1: thread exiting with uncaught exception (group=0x2b542210)
03-26 21:48:45.736: E/AndroidRuntime(27379): FATAL EXCEPTION: main
03-26 21:48:45.736: E/AndroidRuntime(27379): java.lang.IllegalStateException: Could not execute method of the activity
03-26 21:48:45.736: E/AndroidRuntime(27379):    at android.view.View$1.onClick(View.java:3063)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at android.view.View.performClick(View.java:3534)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at android.view.View$PerformClick.run(View.java:14263)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at android.os.Handler.handleCallback(Handler.java:605)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at android.os.Looper.loop(Looper.java:137)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at android.app.ActivityThread.main(ActivityThread.java:4441)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at java.lang.reflect.Method.invokeNative(Native Method)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at java.lang.reflect.Method.invoke(Method.java:511)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at dalvik.system.NativeStart.main(Native Method)
03-26 21:48:45.736: E/AndroidRuntime(27379): Caused by: java.lang.reflect.InvocationTargetException
03-26 21:48:45.736: E/AndroidRuntime(27379):    at java.lang.reflect.Method.invokeNative(Native Method)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at java.lang.reflect.Method.invoke(Method.java:511)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at android.view.View$1.onClick(View.java:3058)
03-26 21:48:45.736: E/AndroidRuntime(27379):    ... 11 more
03-26 21:48:45.736: E/AndroidRuntime(27379): Caused by: java.lang.NullPointerException
03-26 21:48:45.736: E/AndroidRuntime(27379):    at com.eetam.ibokata.Sockettest.Snd_Msg(Sockettest.java:103)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at com.eetam.ibokata.Sockettest.Snd_txt_Msg(Sockettest.java:87)
03-26 21:48:45.736: E/AndroidRuntime(27379):    at com.eetam.ibokata.BokatasActivity.enviar(BokatasActivity.java:131)
03-26 21:48:45.736: E/AndroidRuntime(27379):    ... 14 more

我相信你们!谢谢大家都在寻找解决方案,我会为你们所有人感到高兴。非常感谢你!

2 个答案:

答案 0 :(得分:1)

在你的logcat中你有行

ERROR DE LOS GORDOS0

后跟行

ERROR DE LOS GORDOS3

按照Connect方法中的代码,这意味着该行

miCliente = new Socket("viserion.no-ip.biz", 5555);

是投掷Exception e的人 - 因此您的miCliente变量未初始化并保持null。当您在第103行尝试执行miCliente.getOutputStream()时,您最终获得了NullPointerException

现在,如果您仔细阅读了logcat,您会发现抛出的错误是NetworkOnMainThreadException - 这意味着您正在尝试从主UI线程连接套接字。 Android不允许它(或者至少新版本不允许这样做)。将你的connect / send-message / disconnect代码放在一个单独的线程中(例如AsyncTask) - 你可能会没事。

答案 1 :(得分:0)

miCliente可能是空的。

ERROR DE LOS GORDOS3 - &gt;这意味着某些东西在Connect方法中引发了异常,这可能是在miCliente设置之前 - &gt;空指针异常。

这是由NetworkOnMainThreadException引起的。看这里How to fix android.os.NetworkOnMainThreadException?