Android, es1: esempi di AsyncTask, uno per la
modifica di una immagine in un ImageView, l'altro per la comunicazione
via Socket con un Server.
-
ImageTask è un task asincrono che ogni 2 secondi cambia l'immagine
presente su una ImageView, il cambiamento è una alternanza di due
immagini per al massimo cinque volte.
Il metodo doInBackground esegue le azioni di controllo periodico,
non potendo gestire direttamente la parte grafica (UI) deve invocare
tramite publishProgress il metodo onProgressUpdate.
Alla fine del task viene eseguito il metodo onPostExecute.
-
Definizione AsyncTask.
private class ImageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for(int i=0; i<5; i++) {
if (status == 0) {
//image.setImageResource(R.drawable.zeena1);
status = 1;
} else {
//image.setImageResource(R.drawable.ic_localobidos);
status = 0;
}
try {
publishProgress();
Thread.sleep(2000);
} catch (InterruptedException ex) {
//Toast.makeText(null, "Errore Thread: " + ex.getMessage(), Toast.LENGTH_LONG).show();
}
}
return "Executed";
}
@Override
protected void onProgressUpdate(Void... values) {
//super.onProgressUpdate(values);
if (status == 1) image.setImageResource(R.drawable.zeena1);
else image.setImageResource(R.drawable.ic_localobidos);
}
@Override
protected void onPostExecute(String result) {
image.setImageResource(R.drawable.zeena1);
}
}
-
SocketTask è un task asincrono che invia un solo messaggio a un
server e ne riceve la risposta.
Il metodo doInBackground esegue le azioni di invio e ricezione della
risosta,
non potendo gestire direttamente la parte grafica (UI) dovrebbe
invocare tramite publishProgress il metodo onProgressUpdate,
che in questo caso non serve, in quanto il risultato finale è
presentato tramite il metodo onPostExecute.
La costruzione del Socket non può essere fatta nel costruttore del
task perché sarebbe un'azione non safe thread, pertanto la si deve
fare o direttamente in doInBackground oppure in onPreExecute
(le azioni che precedono l'esecuzione).
-
Definizione SocketTask.
private class SocketTask extends AsyncTask<String, Void, String> {
private String message;
private Socket socket;
private BufferedReader buffer;
private PrintWriter pwrite;
public SocketTask(String message) {
this.message = message;
// try {
// socket = new Socket("192.168.0.3", 10100);
// buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// pwrite = new PrintWriter(socket.getOutputStream());
// }
// catch(Exception ex) {
// System.out.println(ex.getMessage());
// }
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
try {
socket = new Socket("192.168.0.3", 10100);
buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pwrite = new PrintWriter(socket.getOutputStream());
pwrite.println("provaprova");
pwrite.flush();
String s = buffer.readLine();
message = s;
//publishProgress();
}
catch(Exception ex) {
System.out.println(ex.getMessage());
}
return "Executed";
}
// @Override
// protected void onProgressUpdate(Void... values) {
// super.onProgressUpdate(values);
// TextView msg = (TextView) findViewById(R.id.message);
// msg.setText(message);
// }
@Override
protected void onPostExecute(String result) {
TextView msg = (TextView) findViewById(R.id.message);
msg.setText(message + " " + result);
}
}