Autore Topic: Aggiornare un TextView dal metodo Run di un Thread  (Letto 747 volte)

adcarang

  • Visitatore
Aggiornare un TextView dal metodo Run di un Thread
« il: 02 Febbraio 2012, 17:54:24 CET »
0
Salve a tutti.
Ho implementato un client tcp ,il Socket viene attivato in Activity e poi passato a un Thread che nel metodo Run
legge le risposte del server ,ma quando vado a scriverle nel TextView da questo errore

Deprecated Thread methods are not supported.
java.lang.UnsupportedOperationException
at java.lang.VMThread.stop(VMThread.java:85)
at java.lang.Thread.stop(Thread.java:1379)
at java.lang.Thread.stop(Thread.java:1344)
at it.carangelo.adriano.Client_androidActivity.editdisplay(Client_androidActivity.java:143)
at it.carangelo.adriano.ClientThread.run(ClientThread.java:38)
at java.lang.Thread.run(Thread.java:1096)
threadid=17: thread exiting with uncaught exception (group=0x4001b188)
Uncaught handler: thread clientThread exiting due to uncaught exception
 android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2683)
at android.view.ViewRoot.requestLayout(ViewRoot.java:557)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.widget.TextView.checkForRelayout(TextView.java:5373)
at android.widget.TextView.setText(TextView.java:2684)
at android.widget.TextView.setText(TextView.java:2552)
at android.widget.TextView.setText(TextView.java:2527)
at it.carangelo.adriano.Client_androidActivity.editdisplay(Client_androidActivity.java:144)
at it.carangelo.adriano.ClientThread.run(ClientThread.java:38)
at java.lang.Thread.run(Thread.java:1096)

ecco il codice del' Activity
Codice (Java): [Seleziona]
public class  Client_androidActivity extends Activity implements OnClickListener {

        Socket socket = null;
        private  ClientThread client;
    Thread cThread = null;
   

        private EditText textArea;
    private EditText serverIp;
    private Button connectPhones;
    private Button send;
    private String serverIpAddress = "";
    public TextView display;
   
    private RelativeLayout mainLayout;
    private RelativeLayout.LayoutParams listParams;
   
    public boolean connected = false;

    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        serverIp = (EditText) findViewById(R.id.server_ip);
        display = (TextView) findViewById(R.id.display);
       
       
       
        connectPhones = (Button) findViewById(R.id.connect);
        connectPhones.setOnClickListener(this);
        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(this);
       
     
       
       
       
       
       
    }
public void onClick(View v) {
    if (v ==  connectPhones){                  
        if (!connected) {
            String serverIpAddress = "192.168.1.100";
                        InetAddress serverAddr = null;
                        try {
                                serverAddr = InetAddress.getByName(serverIpAddress);
                        } catch (UnknownHostException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
              Log.d("ClientActivity", "C: Connecting...");
              //Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT);
              try {
                                socket = new Socket(serverAddr,10000);
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
              connected = true;
               serverIpAddress = serverIp.getText().toString();
               startThread();
                        }
        }  
    if (v ==  send){                   
        if (connected) {
                client.send("pippo");
        }
    }  
       


}

    private void startThread() {
        if (client == null) {
                client = new ClientThread(socket,this);
        }
        else if (client.isConnected()) {
                client.disconnect();   
        }
       
        //Check to see if the thread is running - if it is, shut it down before creating a new one.
        if (cThread != null ) {
                if (cThread.isAlive()) {
                        cThread.interrupt();
                        cThread = null;
                }
                cThread = null;
        }
        cThread = new Thread(client, "clientThread");
        cThread.start();
       
      }

    public void editdisplay(String msg) {
        cThread.stop();
        display.setText(msg);
        cThread.start();
   
    }  

}


ecco il codice del' Thread
Codice (Java): [Seleziona]
public class ClientThread implements Runnable {
        Socket socket = null;
        private boolean m_connected = false;
        private Client_androidActivity client;         
    private String msg;
               
   
   
public ClientThread(Socket socket ,Client_androidActivity client) {
        this.socket =  socket;
        this.client  =  client;

       
}
       
       
    public void run()  {
 
        while (!m_connected) {
                try {                  
                        msg=receive();
                        client.editdisplay(msg);
                       
               
                       
                       
                       
                       
                        Log.d("ClientActivity", msg);
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
        }
    }

  private EditText findViewById(int display) {
                // TODO Auto-generated method stub
                return null;
        }


public String receive() throws IOException {
        String line = "";
        InputStream inStream = socket.getInputStream();
        int read = inStream.read();
        while (read!=10 && read > -1) {
          line+=String.valueOf((char)read);
          read = inStream.read();
        }
        if (read==-1) return null;
        line+=String.valueOf((char)read);
        return line;
      }

 public synchronized void send(String msg) {
        if (socket != null)  {
            try {
              msg+="\r\n";  
              OutputStream outStream = socket.getOutputStream();
              outStream.write(msg.getBytes());
              outStream.flush();
            }
            catch(IOException ex) {
              ex.printStackTrace();
            }
          }
        }

public synchronized boolean isConnected() {
       

       
        return m_connected;
}
public synchronized void disconnect() {
       
}
}

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Aggiornare un TextView dal metodo Run di un Thread
« Risposta #1 il: 02 Febbraio 2012, 18:50:21 CET »
0
Il logcat parla chiaro  ;-)

Uncaught handler: thread clientThread exiting due to uncaught exception
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Solo il main thread della interfaccia grafica/utente può gestire la l'interfaccia grafica/utente !

Per aggiornare la grafica da un thread separato puoi usare ad esempio un Handler (Handler | Android Developers)
Ma tu ne hai creato uno che poi non hai usato :-P
Dai una lettura anche a questo tutorial presente sul forum : [facile] Aggiornare la UI da una Thread - Android Developers Italia

E attento a fermare i thread nel modo corretto...il metodo stop() dei Thread è deprecato
« Ultima modifica: 02 Febbraio 2012, 19:00:16 CET da teskio »

adcarang

  • Visitatore
Re:Aggiornare un TextView dal metodo Run di un Thread
« Risposta #2 il: 02 Febbraio 2012, 21:01:06 CET »
0
grazie mi e stato molto utile