Message

 

Sous Android (comme sous de nombreux systèmes), il est possible d'envoyer des messages d'évènement. Il s'agit ici de messages dans le sens envoyer un évènement d'un thread à un autre dans une file de messages (Voir Thread, Looper et Handler).

L'affichage d'un message à l'utilisateur, qui n'a absolument rien à voir avec ce sujet, est traité dans Toasts et messages d'alerte. Quant-aux notifications, une autre possibilité d'informer l'utilisateur, voir le chapitre Notification.

Il existe une classe Message qui va permettre de définir le contenu d'un message à envoyer à un handler.

Pour se créer une instance de Message, il est préférable de réutiliser un message recyclé:

Chaque instance message qui n'est plus utilisée retourne dans le pool des objets à recycler.

Il existe une méthode obtain dans la classe Message ou obtainMessage dans la classe Handler qui permet de recycler une instance de message, du moins, s'il y en a dans le pool, sinon, il y aura création automatique d'une nouvelle instance.

Avec la classe Message

static Message obtain()

et ses dérivés qui vont permettre de renseigner au passage le corps du message:
static Message obtain(Handler h, int what, int arg1, int arg2, Object obj)
static Message obtain(Handler h, int what, Object obj)
static Message obtain(Handler h, int what)
static Message obtain(Handler h)
static Message obtain(Handler h, Runnable callback)
static Message obtain(Handler h, int what, int arg1, int arg2)
static Message obtain(Message orig)

ou avec la classe Handler, qui nous évitera d'indiquer le handler, mais il faut une instance de Handler !

final Message obtainMessage()

et ses dérivés:

final Message obtainMessage(int what, int arg1, int arg2)
final Message obtainMessage(int what, int arg1, int arg2, Object obj)
final Message obtainMessage(int what)
final Message obtainMessage(int what, Object obj)

Les arguments d'un message sont:

what qui est un entier permettant de passer la valeur d'un code message "utilisateur" - En gros un message personnalisé.

Image non trouvée !Chaque handler ayant son propre espace, les codes message "utilisateur" ne risque pas de géner d'autres applications ou plutôt thread. Vous pouvez donc utiliser toutes les valeurs que vous voulez ! Seule contrainte, ne pas utiliser deux fois le même code pour deux choses différentes dans votre thread !

arg1 qui est une donnée entière qui sera envoyée dans le message

arg2 une autre donnée entière

obj l'instance d'un objet.

 

Voici un extrait de code pour créer une instance de message

Message msg=Message.obtain(handler, 0, i, j);

Message msg=handler.obtainMessage(0, i, j);

Avec handler une instance sur un Handler, i et j des valeurs pour arg1 et arg2

 

Positionner les valeurs dans le message

Bien que la méthode obtain() vous permet déjà de passer les valeurs ou arguments à votre instance de message, il existe des méthodes qui feront de même:

En fait, arg1, arg2, obj et what sont des données public, vous pouvez donc les modifier directement.

Pour arg1 et arg2, il sera possible de passer par void setData(Bundle data) Pour positionner un bundle avec des données.

 

Récupérer les valeurs passer dans le message

Là encore, arg1, arg2, obj et what sont des données public, vous pourrez donc les récupérer directement.

getData(Bundle data) pour récupérer des bundle.

 

Recyclage d'un message

Si vous êtes certain qu'une instance de message ne sera plus utilisée, pour pouvez le marquer en recyclage. Cependant, si vous ne le faites pas, le système le fera aussi à un moment ou à un autre. Il s'agit en fait d'optimisation plus qu'autre chose.

msg.recycle(); ou msg est l'instance du message à recycler.

 

Exemple de code

Voir l'exemple dans le chapitre Handler