[RESOLVIDO]Receber string via socket

5 respostas
ArthurTurtle

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

5 Respostas

eliangela

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

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

ArthurTurtle

Ola eliangela,

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

ArthurTurtle

Eu de novo hehe.

Bem, eu alterei o codigo e ele ficaria mais ou menos assim?
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){}    
  
            }    
        }  
  
    }  
  
  
}
eliangela

ArthurTurtle:
Eu de novo hehe.

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

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

Espero ter ajudado.

ArthurTurtle
Então eliangela eu resolvi, troquei pra usar AsyncTask Vou deixar o codigo, vai que alguem tem a mesma duvida XD
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) {


		}

	}

}

Muito obrigado por tentar ajudar
[]'s

Criado 18 de janeiro de 2012
Ultima resposta 18 de jan. de 2012
Respostas 5
Participantes 2