Dimenticavo... consiglio di prendere visione anche degli AsyncTask, che sono appositamente sviluppati per queste cose (ossia, esecuzione di un lavoro in un thread con notifica di fine esecuzione e di avanzamento nel UI Thread).
Ciao.![]()
Dimenticavo... consiglio di prendere visione anche degli AsyncTask, che sono appositamente sviluppati per queste cose (ossia, esecuzione di un lavoro in un thread con notifica di fine esecuzione e di avanzamento nel UI Thread).
Ciao.![]()
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
grazie per le dritte, sto provando anche quesuta strada, per ora senza successo
codice:package com.example.prova2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.widget.EditText; public class MainActivity extends Activity { final Context context = this; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ProvaASYNC task = new ProvaASYNC(); //task.execute(new String[] { "http://www.javacodegeeks.com" }); } private class ProvaASYNC extends AsyncTask<String, Void, String> { public EditText et; @Override public String doInBackground(String... urls) { Socket s; BufferedReader in; int st, x=1; String prp=""; et = (EditText) findViewById(R.id.editText1); try { s = new Socket("192.168.4.209", 5000); in = new BufferedReader(new InputStreamReader(s.getInputStream())); while(x == 1) { st=in.read(); if(st != ';') prp+=(char)st; else { et.setText(prp+";"); prp=""; Thread.sleep(50); } } } catch (UnknownHostException e) { Log.e("TuoTag1", "Descrizione del punto di errore", e); //et.setText("socket: unknown host"); } catch (IOException e) { Log.e("TuoTag2", "Descrizione del punto di errore", e); //et.setText("socket: IO Exception"); } catch (Exception e) { Log.e("TuoTag3", "Descrizione del punto di errore", e); } return null; } } }
Come ho detto, dovevi "prendere visione" degli AsyncTask... che significa, leggerne la documentazione.
La prima cosa che ho letto sugli AsyncTask quando li ho visti la prima volta è questa:
Nel metodo doInBackground va scritto il codice da far fare al thread parallelo. E basta. Nessun accesso alla UI.
Tu che hai fatto dentro al doInBackground()? Questo:
codice:et = (EditText) findViewById(R.id.editText1); ... et.setText(prp+";");
esattamente degli accessi alla UI, cioè esattamente ciò che NON va fatto.
Gli AsyncTask mettono a disposizione 3 ulteriori metodi, oltre a doInBackGround() e sono i seguenti, con le specifiche date:
1) onPreExcecute(): invocato nell'UI Thread prima dell'esecuzione del task. Può essere ridefinito per eseguire elaborazioni che devono essere eseguite nel contesto del UI Thread prima che il thread in background parta.
2) onProgressUpdate(); invocato nell'UI Thread dopo l'invocazione del metodo publishProgress() (metodo, questo, da invocare all'interno di doInBackground() per pubblicare un progresso). Permette di informare l'interfaccia grafica del progresso dell'esecuzione.
3) onPostExecute(): invocato nell'UI Thread dopo che il metodo doInBackground() ha finito. Si usa, generalmente, per informare l'interfaccia grafica del fatto che l'elaborazione è finita e per restituire a questa i risultati finali.
Quindi, avevi una possibilità su 4 di sbagliare e l'hai centrata.
Consiglio di partire da qui: Processes and Threads. In particolare (dopo aver letto dall'inizio quella pagina) alla fine c'è la sezione "Using AsyncTask".
Ciao.![]()
Ultima modifica di LeleFT; 05-02-2014 a 17:22
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
per conoscenza: a me da una miriade di errori anche un banale esempio come questo, spero non dipenda dallo sdk http://examples.javacodegeeks.com/an...ctask-example/
Ultima modifica di misterx; 05-02-2014 a 21:37
grazie 1000 per i suggerimenti
ora sta funzionando la prima versione, quella col
runOnUiThread(new Runnable()