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