我的同学和我正在尝试设计一款新应用,但我们遇到了问题 我们正尝试通过套接字将Raspberry与手机连接以发送消息。我们已经编辑了一些来自互联网的代码,以便适合我们的应用程序(该代码工作正常)。我们还没有做太多改变,但我们不知道为什么它不工作,即使方法和一切都是一样的。我找错了,但没有成功。我一直在阅读有关异步任务的内容,但我写的其他代码也没有用。我发布了我正在研究的两个类的方法。
我们希望当从布局按钮调用方法enviar()从ListView获取信息时,将所有内容放入字符串中,打开套接字,发送消息并关闭套接字。字符串的一部分完全正常,但是当它调用其他类时#&方法引发了一个我们不知道如何解决的异常。
注意:println-s是我们调试应用程序的特殊方式。请不要打我们,
以下是代码:
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;
}
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;
}
}
}
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
我相信你们!谢谢大家都在寻找解决方案,我会为你们所有人感到高兴。非常感谢你!
答案 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?