2015-12-21 2 views
-1

У меня возникла проблема с изменением текста текстового представления в android, я начинаю работать в android, нормально, я хочу общаться с сокетами, я сделал сокет и подключился к серверу, но я не может изменить текст TextView, хорошо это код:Проблемы с изменением текста текстового поля

public class Cliente extends Activity { 
    Button conect; 
    Button env; 
    EditText ip; 
    EditText nome; 
    EditText msg; 
    String nome_txt; 
    String ip_txt; 
    Socket cl; 
    String texto = ""; 
    TextView log; 
    boolean a = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.start_layout); 
     conect = (Button) findViewById(R.id.conect); 
     env = (Button) findViewById(R.id.env); 
     msg = (EditText) findViewById(R.id.msg); 
     ip = (EditText) findViewById(R.id.ip_tx); 
     nome = (EditText) findViewById(R.id.nm_tx); 
     log = (TextView) findViewById(R.id.log); 
     conect.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View v) { 
       ip_txt = ip.getText().toString(); 
       nome_txt = nome.getText().toString(); 
       setContentView(R.layout.activity_cliente); 
       Thread th =new Thread(new Ct()); 
       Log.d("Iniciado", "th"); 
       log.setText("asd"); 
       th.start(); 
      } 

     }); 
     env.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View v) { 
       try { 
        envMSG(msg.getText().toString()); 
        msg.setText(""); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

     }); 
    } 

    public void envMSG(String msg) throws IOException { 
     DataOutputStream outToServer = new DataOutputStream(cl.getOutputStream()); 
     outToServer.writeBytes(msg + '\n'); 
    } 
    public String serOUT() { 
     try{ 
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(cl.getInputStream())); 
      if (inFromServer.ready()) { 
       String texto = inFromServer.readLine(); 
       return texto; 
      } else { 
       return null; 
      } 
     }catch(IOException e){ 
      return null; 
     } 
    } 

    public class Ct extends Thread implements Runnable{ 
     @Override 
     public void run() { 
      try { 
       cl = new Socket(ip_txt, 1111); 
       envMSG(nome_txt); 
       do{ 
        String tx = serOUT(); 
        if (tx != null) { 
         texto += tx + "\n"; 
         log.setText(texto); 

          envMSG("ola"); 

        } 
        Log.d("Status",cl.isClosed()+""); 
        this.sleep(10); 

       }while (true); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Пожалуйста, скажите причину ошибки, и показать примеры.

Спасибо за чтение. ass.:Lucas Avelino

+0

Есть ли что-нибудь в logcat, чтобы указать, что происходит не так? –

ответ

0

Прежде всего, вы не можете установить текст внутри потока, вам нужно выполнить ovveride runOnUiThread и попытаться установить текст в этом методе.

public class Ct extends Thread implements Runnable{ 
    @Override 
    public void run() { 
     try { 
      cl = new Socket(ip_txt, 1111); 
      envMSG(nome_txt); 
      do{ 
       String tx = serOUT(); 
       if (tx != null) { 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         texto += tx + "\n"; 
         log.setText(texto); 
         envMSG("ola"); 
        } 
       }); 


       } 
       Log.d("Status",cl.isClosed()+""); 
       this.sleep(10); 

      }while (true); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

Спасибо Мохит Сутар, это работает. –

+0

@LucasAvelino wc :) –