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