04.06.2008 | 22:12:22
immagine
Ing. Emanuele Scapin

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);
            }
        }
            

© Emanuele Scapin 2009-2018

 

Valid HTML 4.01! Valid CSS!