Livello di difficoltà: facileVersione SDK utilizzata: 1.5Link al file compresso del progetto eclipse: file in allegatoPrima della versione 1.5 di android, per poter eseguire aggiornamenti sull'interfaccia grafica durante l'esecuzione di una Thread, era necessario usare degli Handler dichiarati all interno di onCreate (UI thread) e usati all'interno delle classiche Thread java
http://developer.android.com/guide/appendix/faq/commontasks.html#threading oppure in alternativa usare il metodo runOnUiThread di Activity
Questo procedimento risulta a volte scomodo, e alla lunga porta ad una leggibilità del codice pressochè impossibile.
Per ovviare a questo problema, il framework mette a disposizione, a partire dalla versione 1.5, una comoda classe chiamata AsyncTask.
Questa classe oltre ad eseguire del codice in parallelo (Threading) mette a disposizione dei metodi per eseguire gli update alla nostra UI.
Vediamo un esempio del funzionamento di questa classe:
Creiamo un semplice layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="press start to begin"
android:id="@+id/loadingTv"
android:inputType="textMultiLine" />
<Button
android:text="start"
android:id="@+id/startButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>Implementazione e commenti:
public class Demo extends Activity {
TextView loadingTv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
loadingTv = (TextView) findViewById(R.id.loadingTv);
Button start = (Button) findViewById(R.id.startButton);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
LoadingStuffTask task = new LoadingStuffTask();
task.execute("Process started!");
//la stringa verra passata al metodo doInBackground del nostro AsyncTask
//per controllare lo stato del task, possiamo chiamare task.getStatus()
}
});
}
private class LoadingStuffTask extends AsyncTask<String, String, String> {
// I tre tipi da dichiarare sono relativamente (in questo caso usiamo solo stringhe)
// il parametro in entrata di doInBackground (quando chiamiamo execute passiamo una stringa)
// il paramentro in entrata di onProgressUpdate (dati che vogliamo mostrare all' utente -opzionale,potremmo usare variabili globali-)
// il parametro in entrata di onPostExecure (una volta finito il task, potremmo voler mostrare un risultato all'utente)
// nel caso non volessimo usare parametri di alcun genere tipizziamo con Void,Void,Void (passeremo poi dei null come parametri)
@Override
protected String doInBackground(String... params) {
publishProgress("\n" + params[0]);
// stringa passata a onProgressUpdate
Random rand = new Random();
publishProgress("Loading module 1 ...");
while (rand.nextInt(1000000) != 2) {
}
// "simuliamo" dei calcoli
publishProgress("Loading module 2 ...");
while (rand.nextInt(1000000) != 1) {
}
return "Finish !";
// stringa passata a onPostExecute
}
@Override
protected void onProgressUpdate(String... values) {
loadingTv.append(values[0] + "\n");
}
@Override
protected void onPostExecute(String result) {
loadingTv.append(result + "\n");
}
}
}
Bye
