décembre
2011
Tout fier, je me lance dans ma première application à l’aide de Mono for Android.
Je crée un projet sous Visual Studio 2010 et me munis de mon téléphone sous Android.
Pour les imprimes écrans, j’utilise l’option screen capture du logiciel ddms (dalvik debug monitor) fournit avec le sdk de mono.
L’application à créer est simple:
- Ouverture d’une activité à partir d’un bouton
- Fermeture de l’activité ouverte
- Affichage d’un message à l’écran sur fermeture de la seconde activité.
Dans une application standard, la logique reviendrait à exécuter un écran modal et après la fermeture de l’écran, on afficherait le message. Ce qui donnerai en C#:
{
Form ecran2 = new Form();
ecran2.ShowModal();
MessageBox.Show("mon message");
}
En Mono for Android, cela donnerait:
{
this.StartActivity(typeof(ecran2));
Toast.MakeText(this, "Mon message", ToastLength.Short).Show();
}
Et là surprise… l’activité se lance et on voit le message s’afficher en même temps. Que passa???
En lisant la documentation du Android SDK et en surfant, j’arrive à la conclusion qu’Android est entièrement asynchrone.
Pour ceux qui connaisse un peu Flex, c’est la même « bordel », il faut tout synchroniser dans un evenement global.
Cet événement global est expliqué sur beaucoup de site et cela fonctionne bien pour une petite application qui n’a beaucoup d’écran imbriqué.
Parlons maintenant du synchronise entre deux threads, si un thread doit attendre la fin d’un autre Thread pour continuer son traitement. Comment faire?
Un novice ferait une boucle d’attente comme un while. Les développeurs utiliseront un mutex ou un sémaphore.
exemple: thread1 lance le thread2 et thread1 attends la liberation du jeton du mutex.
Pour celà j’utilise l’objet « AutoResetEvent ».
Pour en revenir à notre application, je vais appliquer ceprincipe sans passer par l’événement global.
Pour cela il faudra créer l’écran2 dans un Thread. En effet si je bloque le mutex dans le thread principal, votre application est figé!
Dans l’écran2, j’ai mis un AutoResetEvent en static
Activité principale:
{
Thread t = new Thread(() =>
{
this.StartActivity(typeof(ecran2));
ecran2.MonMutex.WaitOne();
this.RunOnUiThread(() =>
{
Toast.MakeText(this, "Mon message", ToastLength.Short).Show();
});
});
t.Start();
}
Ecran2:
public class ecran2 : Activity
{
public static AutoResetEvent MonMutex = new AutoResetEvent(false);
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Create your application here
}
protected override void OnDestroy()
{
base.OnDestroy();
MonMutex.Set();
}
}
le « RunOnUiThread » sert à intéragir avec le thread de l’activité en cours, néccessaire pour intéragir avec des élément graphiques.
Le miracle opère, le message s’affiche après la fermeture de l’écran2.
Dans le prochain billet, je décrirai un processus plus complet pour passer des variables et les mutex sur chaque activity lancés.
1 Commentaire + Ajouter un commentaire
Commentaires récents
- Mono for Android dans
- Mono for Android dans
- [Mono]Asynchrone Mon meilleur ennemi dans
Merci pour l’article, c’est toujours intéressant à lire et possédant un smartphone sous android ça donne envie d’approfondir « Mono for Android », c’est partit pour les recherches…