Problema con Thread Java - Android
Creando un socket entre Android y Java he conseguido conectarlo. El problema es que puedo enviar un mensaje desde Android a Java, pero a la hora de hacerlo al contrario me da un problema de AndroidRuntime Fatal Exception: Thread - 71, he estado googleando pero no he conseguido encontrar nada consistente.
El caso es que cuando comento la parte de leer(), la aplicación no me da problemas y si no la comento me lanza la excepción. Quiero saber como puedo resolverlo.
Gracias de antemano.
Código Android:
package com.example.socketandroid; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.Switch; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener{ private TextView tv1, tv2; private EditText et1, etip, etport; private Switch swch; private Button btn1, btn2; private Thread t; private Socket s; private boolean estado; private String ip; private int port; private DataInputStream dis; private DataOutputStream dos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Declaración de las variables. Tv1 = (TextView) findViewById(R.id.textView1); tv2 = (TextView) findViewById(R.id.textView2); et1 = (EditText) findViewById(R.id.editText1); etip = (EditText) findViewById(R.id.dir_ip); etport = (EditText) findViewById(R.id.dir_port); swch = (Switch) findViewById(R.id.switch1); btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); //Declaración de las llamadas. Btn1.setOnClickListener(this); btn2.setOnClickListener(this); swch.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked){ estado = connect(); tv2.append("Conexión establecida\n"); etip.setEnabled(false); etport.setEnabled(false); }else{ estado = disconnect(); tv2.append("Desconexión\n"); etip.setEnabled(true); etport.setEnabled(true); } estadoconexion(estado); } });; } public void estadoconexion(boolean estado){ if(estado) tv1.setText("Conectado"); else tv1.setText("Desconectado"); } public boolean connect(){ ip = etip.getText().toString(); port = Integer.valueOf(etport.getText().toString()); try{ t = new Thread(new ClientThread()); t.start(); return true; }catch(Exception ex){ tv1.setText("Error connect()"); Log.e("Error connect()", "" +ex); } return false; } public boolean disconnect(){ try{ dos.close(); dis.close(); s.close(); return false; }catch(Exception ex){ tv1.setText("Error disconnect()"); Log.e("Error disconnect()", "" +ex); } return true; } @Override public void onClick(View v) { switch(v.getId()){ case R.id.btn1: if(estado){ String frase = et1.getText().toString(); try { dos.writeUTF(frase); tv2.append("Yo: " +frase +"\n"); } catch (IOException e) { tv1.setText("Error enviar()"); e.printStackTrace(); } } else { tv2.append("Cliente desconectado\n"); } case R.id.btn2: et1.setText(""); break; } } class ClientThread implements Runnable { public void run(){ try{ s = new Socket(ip, port); dis = new DataInputStream(s.getInputStream()); tv1.append(" - DIS\n"); dos = new DataOutputStream(s.getOutputStream()); tv1.append(" - DOS\n"); this.leer(); }catch(UnknownHostException ex){ tv1.setText("Error run()"); System.out.println(ex); ex.printStackTrace(); }catch(IOException ex){ tv1.setText("Error run()"); System.out.println(ex); ex.printStackTrace(); } } public void leer(){ String frase; while(true){ try{ frase = dis.readUTF(); if(frase =! Null){ tv2.append("Yo: " +frase +"\n"); } Thread.sleep(100); }catch(Exception ex){ tv1.setText("Error leer()"); System.out.println(ex); ex.printStackTrace(); } } } } // fin de ClientThread } // fin de la clase