[RESOLVIDO]Receber string via socket

Boa tarde!
Estou tendo dificuldade em desenvolver um app que recebe uma string via socket de um server, o maior problema é em deixar o android conectado com o server enquanto ele atualiza a view com a string que chega, oque eu tenho é mais ou menos isso:

package br.com.steno.legenda;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Observable;
import java.util.Observer;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Looper;
import android.os.Process;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class LegendaMobiActivity extends Activity implements Observer{
    /** Called when the activity is first created. */
    Activity activity= this;
    private Thread processo;
    TextView textViewLegenda;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btnConfig= (Button) findViewById(R.id.button1);
        Button btnConectar= (Button) findViewById(R.id.btnConectar);
        textViewLegenda= (TextView) findViewById(R.id.textViewLegenda);

        btnConectar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                processo= new Thread(new RecebeTextoDoServer(LegendaMobiActivity.this));
                processo.start();
            }
        });


        
    }

    @Override
    public void update(Observable observable, Object data) {
        // TODO Auto-generated method stub

    }
    

    private class RecebeTextoDoServer extends Observable
    implements Runnable {

        public RecebeTextoDoServer(Observer observer){
            addObserver(observer);
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            Socket s = null;  
            BufferedReader entrada=null; 
            try{  

                s = new Socket("192.168.1.118", 7000);  
                entrada = new BufferedReader(new InputStreamReader(s.getInputStream())); 
                while(true){
                    textViewLegenda.setText(entrada.readLine());
                    Log.e("Msg", entrada.readLine());
                }   
            }catch(IOException e){  

                Log.e("Erro", "Ops! A conexão não foi aceita.");

            }finally{  

                try{  

                    s.close();  

                }catch(IOException e){}  

            }  
            notifyObservers(true);
            setChanged();
        }

    }


}

Com esse codigo eu consigo a conexão com o server, mais quando o server envia uma msg ele joga uma:

Only the original thread that created a view hierarchy can touch its views.

Nesse caso como eu deveria proceder?
Eu deixo a parte de conexão e recebimento de texto em uma thread separada, pois se eu não faço isso ele “amarra” a app.

Desde ja agradeço.

Arthur dos Santos

[quote=ArthurTurtle] Only the original thread that created a view hierarchy can touch its views.
[/quote]

Olá Arthur!

Somente a thread que cria a interface gráfica pode iteragir com ela, ou seja, vc não deveria usar este código textViewLegenda.setText(entrada.readLine()) na outra classe (que é outra Thread).
Já que vc está usando o Pattern Observer, coloca esse código no método update();

Espero ter ajudado

Ola eliangela,

brigado pela dica, vou testar e ja volto a posta se deu certo ou errado.

Eu de novo hehe.

Bem, eu alterei o codigo e ele ficaria mais ou menos assim?

[code]
package br.com.steno.legenda;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Observable;
import java.util.Observer;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Process;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class LegendaMobiActivity extends Activity implements Observer{
/** Called when the activity is first created. */
Activity activity= this;
private Thread processo;
TextView textViewLegenda;

@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  

    Button btnConfig= (Button) findViewById(R.id.button1);  
    Button btnConectar= (Button) findViewById(R.id.btnConectar);  
    textViewLegenda= (TextView) findViewById(R.id.textViewLegenda);  

    btnConectar.setOnClickListener(new OnClickListener() {  

        @Override  
        public void onClick(View v) {  
            // TODO Auto-generated method stub  
            processo= new Thread(new RecebeTextoDoServer(LegendaMobiActivity.this));  
            processo.start();  
        }  
    });  


      
}  

@Override  
public void update(Observable observable, Object data) {  
    // TODO Auto-generated method stub  
   //aqui eu faria o setText, certo?
   // porem se eu faço o setText aqui ele joga a mesma exception :(
	Log.e("update", data.toString());

}  
  

private class RecebeTextoDoServer extends Observable  
implements Runnable {  

    public RecebeTextoDoServer(Observer observer){  
        addObserver(observer);  
    }  

    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        Socket s = null;    
        BufferedReader entrada=null;   
        String texto = new String();
        try{    

            s = new Socket("192.168.1.118", 7000);    
            entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
            
            while(true){  
            	texto=entrada.readLine();    
                Log.e("Msg", entrada.readLine()); 
                notifyObservers(true);
                update(this, texto);
                setChanged();  
            }     
        }catch(IOException e){    
        	
            Log.e("Erro", "Ops! A conexão não foi aceita.");  

        }finally{    

            try{    

                s.close();    

            }catch(IOException e){}    

        }    
    }  

}  

}[/code]

[quote=ArthurTurtle]Eu de novo hehe.

Bem, eu alterei o codigo e ele ficaria mais ou menos assim?
[/quote]

aparentemente está correto.
Testa e vê se funciona.

Espero ter ajudado.

Então eliangela eu resolvi, troquei pra usar AsyncTask
Vou deixar o codigo, vai que alguem tem a mesma duvida XD

[code]
package br.com.steno.legenda;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Observable;
import java.util.Observer;

import android.app.Activity;
import android.app.Dialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class LegendaMobiActivity extends Activity{
/** Called when the activity is first created. */
Activity activity= this;
TextView textViewLegenda;

@Override  
public void onCreate(Bundle savedInstanceState) {  
	super.onCreate(savedInstanceState);  
	setContentView(R.layout.main);  

	Button btnConfig= (Button) findViewById(R.id.button1);  
	Button btnConectar= (Button) findViewById(R.id.btnConectar);  
	textViewLegenda= (TextView) findViewById(R.id.textViewLegenda);  

	btnConectar.setOnClickListener(new OnClickListener() {  

		@Override  
		public void onClick(View v) {  
			// TODO Auto-generated method stub  
			ProcessoDoServer doServer= new ProcessoDoServer();
			doServer.execute("Conectanto...");

		}  
	});  



}  

private class ProcessoDoServer extends AsyncTask<String, String, String>{

	@Override
	protected String doInBackground(String... params) {
		// TODO Auto-generated method stub
		Socket s = null;    
		BufferedReader entrada=null;   
		try{    

			s = new Socket("192.168.1.118", 7000);    
			entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));

			while(true){  
				//passa a string pro metodo onProgressUpdate
				publishProgress(entrada.readLine());
			}     
		}catch(IOException e){    

			Log.e("Erro", "Ops! A conexão não foi aceita.");  

		}finally{    

			try{    

				s.close();    

			}catch(IOException e){}    

		}    
		return null;
	}

	@Override
	protected void onProgressUpdate(String... values) {
		//faz o update do text com o valor passado
		textViewLegenda.setText(values[0]);

	}

	@Override
	protected void onPostExecute(String result) {


	}

}

}[/code]

Muito obrigado por tentar ajudar
[]'s