Handler

Gestion des opérations asynchrones avec Handler

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Dans l'article consacré à l'AsyncTask dans Android on a abordé la possibilité de gérer les tâches asynchrones via Handlers. Ici on se focalisera plus sur cette approche.

Pour gérer les tâches asynchrones on peut aussi utiliser des Handler. L'implémentation est aussi simple que dans le cas des AsyncTask mais elle permet plus de choses. On peut par exemple exécuter une tâche immédiatement, au bout d'un certain temps ou à un moment précis dans le futur (méthodes : post(), postDelayed(), postAtTime()). Dans notre exemple, utilisé pour soumettre les erreurs de l'application au web service adéquat, on va utilise le cas le plus simple : envoi immédiat :

 
public class Logger {
    private final static String LOG_TAG = Logger.class.getName();
    private static Map> messages;
    private static Activity activity;
    private static Handler handler;
    // ...
    public static void sendPending() {
        if (messages != null && activity != null && messages.size() > 0) {
            if (handler == null) handler = new Handler();
            Runnable runnable = new Runnable() {
                 @Override
                 public void run() {
                     handler.post(new Runnable() {
                	     @Override
                	     public void run() {
                             try {
                                 Log.d(LOG_TAG, "Sending errors to web service : "+messages);
                                 LoggerClientREST loggerClientREST = new LoggerClientREST();
                                 loggerClientREST.setActivity(activity);
                                 loggerClientREST.sendMessages(messages);
                             } catch (Exception e) {
                                 Log.e(LOG_TAG, " An error occurred on generating message to log", e);
                             } finally {
                                 messages = null;	
                            }
                         }
                     });
	             }
	        };
            new Thread(runnable).start();
        }
    }
}

Le code est simple. Au début on implémente Runnable qui poste la tâche à exécuter. A la fin on crée et démarre un nouveau Thread avec l'action appropriée.

Expliquer la différence avec AsyncTask

Bartosz KONIECZNY Tâches asynchrones

Une question ? Une remarque ?

*

*

Un conseil MySQL

Qu'est-ce que signifie l'attribut UNSIGNED ?

Si notre base stocke uniquement les valeurs supérieures à 0, il faut utiliser un attribut qui aggrandit le nombre des chiffres possibles à sauvegarder. Il s'agit de l'attribut UNSIGNED qu'on peut appliquer aux champs numériques. Prenons l'exemple d'un champ type BIGINT. Normalement il occupe 8 octets et stocke les nombres entiers entre -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807. Cependant, cela s'avère très peu utile lorsqu'on est sûr d'avoir uniquement les entiers positifs. En rajoutant l'attribut UNSIGNED à ce champ on double sa capacité de stockage. Alors il est capable de contenir les chiffres de 0 à 18 446 744 073 709 551 615.