<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Découvrons DotNet sur différentes plateformes &#187; Mono for Android</title>
	<atom:link href="https://blog.developpez.com/insideqt/pcategory/mono-for-android/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/insideqt</link>
	<description></description>
	<lastBuildDate>Sun, 28 Dec 2014 15:50:37 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>[Mono]Asynchrone Mon meilleur ennemi</title>
		<link>https://blog.developpez.com/insideqt/p10605/mono-for-android/asynchrone_mon_meilleur_ennemi</link>
		<comments>https://blog.developpez.com/insideqt/p10605/mono-for-android/asynchrone_mon_meilleur_ennemi#comments</comments>
		<pubDate>Wed, 21 Dec 2011 23:27:57 +0000</pubDate>
		<dc:creator><![CDATA[Aktaour]]></dc:creator>
				<category><![CDATA[Mono for Android]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Tout fier, je me lance dans ma première application à l&#8217;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&#8217;utilise l&#8217;option screen capture du logiciel ddms (dalvik debug monitor) fournit avec le sdk de mono. L&#8217;application à créer est simple: Ouverture d&#8217;une activité à partir d&#8217;un bouton Fermeture de l&#8217;activité ouverte Affichage d&#8217;un message à l&#8217;écran sur fermeture de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Tout fier, je me lance dans ma première application à l&rsquo;aide de Mono for Android.</p>
<p>Je crée un projet sous Visual Studio 2010 et me munis de mon téléphone sous Android.<br />
Pour les imprimes écrans, j&rsquo;utilise l&rsquo;option screen capture du logiciel ddms (dalvik debug monitor) fournit avec le sdk de mono.</p>
<p>L&rsquo;application à créer est simple: </p>
<ul>
<li>Ouverture d&rsquo;une activité à partir d&rsquo;un bouton</li>
<li>Fermeture de l&rsquo;activité ouverte</li>
<li>Affichage d&rsquo;un message à l&rsquo;écran sur fermeture de la seconde activité. </li>
</ul>
<p><span id="more-6"></span></p>
<p>Dans une application standard, la logique reviendrait à exécuter un écran modal et après la fermeture de l&rsquo;écran, on afficherait le message. Ce qui donnerai en C#:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">void MaLoquique() <br />
{ <br />
&nbsp; Form ecran2 = new Form(); <br />
&nbsp; ecran2.ShowModal(); <br />
&nbsp; MessageBox.Show(&quot;mon message&quot;); <br />
}</div></div>
<p>En Mono for Android, cela donnerait:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">void MaLoquique() <br />
{ <br />
&nbsp;this.StartActivity(typeof(ecran2)); <br />
&nbsp;Toast.MakeText(this, &quot;Mon message&quot;, ToastLength.Short).Show(); <br />
}</div></div>
<p>Et là surprise&#8230; l&rsquo;activité se lance et on voit le message s&rsquo;afficher en même temps. Que passa???<br />
En lisant la documentation du Android SDK et en surfant, j&rsquo;arrive à la conclusion qu&rsquo;Android est entièrement asynchrone.</p>
<p>Pour ceux qui connaisse un peu Flex, c&rsquo;est la même &laquo;&nbsp;bordel&nbsp;&raquo;, il faut tout synchroniser dans un evenement global.</p>
<p>Cet événement global est expliqué sur beaucoup de site et cela fonctionne bien pour une petite application qui n&rsquo;a beaucoup d&rsquo;écran imbriqué.</p>
<p>Parlons maintenant du synchronise entre deux threads, si un thread doit attendre la fin d&rsquo;un autre Thread pour continuer son traitement. Comment faire?<br />
Un novice ferait une boucle d&rsquo;attente comme un while. Les développeurs utiliseront un mutex ou un sémaphore.<br />
exemple: thread1 lance le thread2 et thread1 attends la liberation du jeton du mutex.<br />
Pour celà j&rsquo;utilise l&rsquo;objet &laquo;&nbsp;AutoResetEvent&nbsp;&raquo;.</p>
<p>Pour en revenir à notre application, je vais appliquer ceprincipe sans passer par l&rsquo;événement global.<br />
Pour cela il faudra créer l&rsquo;écran2 dans un Thread. En effet si je bloque le mutex dans le thread principal, votre application est figé!<br />
Dans l&rsquo;écran2, j&rsquo;ai mis un AutoResetEvent en static</p>
<p>Activité principale:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">void MaLoquique() <br />
{ <br />
&nbsp; Thread t = new Thread(() =&gt; <br />
&nbsp;{ <br />
&nbsp; &nbsp;this.StartActivity(typeof(ecran2)); <br />
&nbsp;<br />
&nbsp; &nbsp;ecran2.MonMutex.WaitOne(); <br />
&nbsp;<br />
&nbsp; &nbsp;this.RunOnUiThread(() =&gt; <br />
&nbsp; &nbsp;{ <br />
&nbsp; &nbsp; &nbsp; Toast.MakeText(this, &quot;Mon message&quot;, ToastLength.Short).Show(); <br />
&nbsp; &nbsp;}); <br />
&nbsp;}); <br />
&nbsp;t.Start(); <br />
}</div></div>
<p>Ecran2:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; [Activity(Label = &quot;ecran2&quot;)] <br />
&nbsp; &nbsp; public class ecran2 : Activity <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; public static AutoResetEvent MonMutex = new AutoResetEvent(false); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; protected override void OnCreate(Bundle bundle) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; base.OnCreate(bundle); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Create your application here <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; protected override void OnDestroy() <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; base.OnDestroy(); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MonMutex.Set(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; }</div></div>
<p>le &laquo;&nbsp;RunOnUiThread&nbsp;&raquo; sert à intéragir avec le thread de l&rsquo;activité en cours, néccessaire pour intéragir avec des élément graphiques.</p>
<p>Le miracle opère, le message s&rsquo;affiche après la fermeture de l&rsquo;écran2.</p>
<p>Dans le prochain billet, je décrirai un processus plus complet pour passer des variables et les mutex sur chaque activity lancés.</p>
<p><a href="http://dl.dropbox.com/u/40788674/tutomonoforandroid/appAsynchrone.zip">Voici le code source lié à ce billet</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Mono]Asynchrone Mon meilleur ennemi (suite)</title>
		<link>https://blog.developpez.com/insideqt/p10611/mono-for-android/title_213</link>
		<comments>https://blog.developpez.com/insideqt/p10611/mono-for-android/title_213#comments</comments>
		<pubDate>Sun, 25 Dec 2011 11:32:59 +0000</pubDate>
		<dc:creator><![CDATA[Aktaour]]></dc:creator>
				<category><![CDATA[Mono for Android]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il y a quelques jours j&#8217;exposai vulgairement ma façon de développer en ansynchrone entre différentes activity. Aujourd&#8217;hui je vous montre comment faire en mutualisant la génération des mutex et des paramètres passés entre activity. Pour cela , je crée: Une classe static nommée BibFrm (Bibliothèque pour les fomulaires) qui contiendra une liste de paramètres liée à chaque activity par un identifiant. Une classe nommé ParamFrm qui contiendra les paramètres (cle/valeur) de mon activity Un objet [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Il y a quelques jours j&rsquo;exposai vulgairement ma façon de développer en ansynchrone entre différentes activity.</p>
<p>Aujourd&rsquo;hui je vous montre comment faire en mutualisant la génération des mutex et des paramètres passés entre activity.</p>
<p>Pour cela , je crée:</p>
<ul>
<li>Une classe static nommée BibFrm (Bibliothèque pour les fomulaires) qui contiendra une liste de paramètres liée à chaque activity par un identifiant.</li>
<li>Une classe nommé ParamFrm qui contiendra les paramètres (cle/valeur) de mon activity</li>
<li>Un objet pour accéder de manière unique à mes paramètres (Univers Threadé) nommé mutexParamFrm</li>
<li>Une fonction de recupération de paramètres généric</li>
<li>Une fonction de suppression complète de paramètres</li>
<li>Une fonction d&rsquo;ajout de paramètres</li>
<li>Une fonction de calcul du prochain identifiant des activity</li>
</ul>
<p><span id="more-7"></span></p>
<p>La génération des identifiants des activity. Noté que l&rsquo;objet mutexParamFrm sert à locker l&rsquo;accès interThread a une seul iteration à la fois.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; public static object mutexParamFrm = new object(); <br />
&nbsp; &nbsp; private static int idFrm = 0; <br />
&nbsp; &nbsp; public static int ProchainIdFrm() <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; int result = 1; <br />
&nbsp; &nbsp; lock (mutexParamFrm) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (idFrm == Int32.MaxValue) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idFrm = 1; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idFrm++; <br />
&nbsp; &nbsp; &nbsp; result = idFrm; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; return result; <br />
&nbsp; &nbsp; }</div></div>
<p>La classe contenant les paramètres</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; internal class ParamFrm <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; public string Cle = string.Empty; <br />
&nbsp; &nbsp; &nbsp; &nbsp; public object Obj = null; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public ParamFrm() <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; public ParamFrm(string cle, object obj) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cle = cle; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Obj = obj; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; }</div></div>
<p>La fonction de récupération de paramètres</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; public static List&lt;ParamFrm&gt; recupListeParamFrm(int idFrm) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List&lt;ParamFrm&gt; listeParam = null; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (listeParamDesFrm.ContainsKey(idFrm)) // récupération de la liste des paramètres par rapport à la clé <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listeParam = listeParamDesFrm[idFrm]; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listeParam = new List&lt;ParamFrm&gt;(); // génération de la liste si non présent <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listeParam.Add(new ParamFrm(&quot;mutexfrm&quot;, new AutoResetEvent(false))); //ajout auto du mutex pour bloquer les activity parentes <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listeParamDesFrm.Add(idFrm, listeParam); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return listeParam; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public static bool recupParamFrm&lt;T&gt;(int idFrm, string nomParam, out T obj) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool result = false; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj = default(T); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nomParam = nomParam.ToLower(); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lock (lockParamFrm) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List&lt;ParamFrm&gt; listeParam = recupListeParamFrm(idFrm); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (ParamFrm paramFrm in listeParam) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (paramFrm.Cle == nomParam) //la cle est toutjours un minuscule <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = true; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj = (T)paramFrm.Obj; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return result; <br />
&nbsp; &nbsp; &nbsp; &nbsp; }</div></div>
<p>La fonction de vidage des paramètres</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; public static void viderParamFrm(int idFrm) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lock (lockParamFrm) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (listeParamDesFrm.ContainsKey(idFrm)) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listeParamDesFrm.Remove(idFrm); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; }</div></div>
<p>La fonction d&rsquo;ajout de paramètres</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; public static void ajouteParamFrm(int idFrm, string nomParam, object obj) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nomParam = nomParam.ToLower(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lock (lockParamFrm) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List&lt;ParamFrm&gt; listeParam = recupListeParamFrm(idFrm); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool trouve = false; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (ParamFrm paramFrm in listeParam) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (paramFrm.Cle == nomParam) //la cle est toutjours un minuscule <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trouve = true; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; paramFrm.Obj = obj; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!trouve) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listeParam.Add(new ParamFrm(nomParam, obj)); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; }</div></div>
<p>Pour plus de clareté, je lance l&rsquo;activité &laquo;&nbsp;ecran2&Prime; dans sa propre class par la méthode static Afficher:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; public static void Afficher(Activity activity, string titre) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object obj; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int idFrm = BibFrm.ProchainIdFrm(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (BibFrm.recupParamFrm(idFrm, BibFrm.nomParamMutexFrm, out obj)) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BibFrm.ajouteParamFrm(idFrm, &quot;titre&quot;, titre); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AutoResetEvent a = (AutoResetEvent)obj; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Intent intent = new Intent(activity, typeof(ecran2)); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; activity.RunOnUiThread(() =&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; intent.PutExtra(&quot;idfrm&quot;, idFrm); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; activity.StartActivity(intent); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a.WaitOne(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BibFrm.viderParamFrm(idFrm); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; }</div></div>
<p>Chaque paramètre sera ajouté dans la liste des paramètres customisé. Je ne préfère pas utiliser les Itent car il est impossible de leur passer des objets complexes sans les sérialiser.<br />
L&rsquo;itent est utilisé uniquement pour sauvegarder l&rsquo;identifiant de la fenetre.</p>
<p>Dès lors, le thread est bloqué et attends la fermeture de l&rsquo;activité.<br />
Pour les plus codeurs d&rsquo;entre vous, vous pouvez mettre tout ce code dans une activité parente et dérivé toutes vos activity de celle ci et le tour est joué.</p>
<p>Bonne fêtes de fin d&rsquo;année.</p>
<p><a href="http://dl.dropbox.com/u/40788674/tutomonoforandroid/appAsynchronegeneralise.zip">Voici le code source lié à ce billet</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Mono]Orientation de l&#8217;écran</title>
		<link>https://blog.developpez.com/insideqt/p10614/mono-for-android/orientation_de_l_ecran</link>
		<comments>https://blog.developpez.com/insideqt/p10614/mono-for-android/orientation_de_l_ecran#comments</comments>
		<pubDate>Mon, 26 Dec 2011 10:11:33 +0000</pubDate>
		<dc:creator><![CDATA[Aktaour]]></dc:creator>
				<category><![CDATA[Mono for Android]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Sur Android, l&#8217;orientation de l&#8217;écran influe sur l&#8217;affichage des applications. L&#8217;Android SDK offre la possibilité aux écrans de s&#8217;adapter à la résolution par ces systèmes de gravité (sorte de point d&#8217;ancrage). Je crée mon application et je m&#8217;amuse à la passer du mode portrait au mode paysage. Cette application se connecte en TCP à mon PC, et rapidement je me suis rendu compte que mon application se comporte étrangement. En effet, à chaque changement d&#8217;orientation, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Sur Android, l&rsquo;orientation de l&rsquo;écran influe sur l&rsquo;affichage des applications.<br />
L&rsquo;Android SDK offre la possibilité aux écrans de s&rsquo;adapter à la résolution par ces systèmes de gravité (sorte de point d&rsquo;ancrage).<br />
Je crée mon application et je m&rsquo;amuse à la passer du mode portrait au mode paysage.<br />
Cette application se connecte en TCP à mon PC, et rapidement je me suis rendu compte que mon application se comporte étrangement.</p>
<p>En effet, à chaque changement d&rsquo;orientation, ma connexion TCP se renouvelle. Après plusieurs heures d&rsquo;analyses et de recherches j&rsquo;ai compris et résolu le problème.</p>
<p>Par défaut, à chaque changement d&rsquo;orientation, l&rsquo;Activity courante est détruite puis recréé par le système Android.<br />
Imaginez ma frustration en constatant cela, où sont mes objets en mémoires -> disparu&#8230;.</p>
<p>Je connais deux solutions à ce problème:</p>
<ul>
<li>Surcharger la méthode onRetainNonConfigurationInstance pour en sauvegarder un seul objet. Je dé-conseil ce n&rsquo;est vraiment pas pratique</li>
<li>Surchager la méthode OnConfigurationChanged</li>
</ul>
<p>Le fait de surcharger la méthode OnConfigurationChanged et de définir la propriété ConfigurationChanges au Manifeste permet de ne plus redémarrer l&rsquo;activité courante en cas de changement d&rsquo;orientation.</p>
<p>TIPs: en java, les propriétés ConfigurationChanges se trouve dans le fichier AndroidManifest.xml du projet. Sous Mono for Android c&rsquo;est dans l&rsquo;entête de votre définition de la classe qu&rsquo;il se trouve.</p>
<p>Exemple:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[Activity(Label = &quot;FrmTest &quot;, ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation)] <br />
public class FrmTest : Activity <br />
{ <br />
&nbsp; /// &lt;summary&gt; <br />
&nbsp; /// Permet de ne plus redemarrer l'activité sur un changement de configuration <br />
&nbsp; /// &lt;/summary&gt; <br />
&nbsp; /// &lt;param name=&quot;newConfig&quot;&gt;&lt;/param&gt; <br />
&nbsp; public override void OnConfigurationChanged(Configuration newConfig) <br />
&nbsp; { <br />
&nbsp; &nbsp; base.OnConfigurationChanged(newConfig); <br />
&nbsp; } <br />
}</div></div>
<p>Cette petite astuce vous permettra sans doute de gagner du temps :).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mono for Android</title>
		<link>https://blog.developpez.com/insideqt/p10603/mono-for-android/mono_for_android</link>
		<comments>https://blog.developpez.com/insideqt/p10603/mono-for-android/mono_for_android#comments</comments>
		<pubDate>Wed, 21 Dec 2011 21:15:03 +0000</pubDate>
		<dc:creator><![CDATA[Aktaour]]></dc:creator>
				<category><![CDATA[Mono for Android]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Je suis passé d&#8217;un Iphone à un Samsung Note sous Android 2.3.6, je pars donc à la découverte de Mono for Android. Pour information, Mono for Android permet de développer des applications en C#. Il est basé sur le runtime Mono et est propriété de la société Xamarin . L&#8217;interface graphique est basé sur les fichiers axml de l&#8217;android sdk. Il est donc assez aisé de trouver de la documentation sur la partie graphique [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Je suis passé d&rsquo;un Iphone à un Samsung Note sous Android 2.3.6, je pars donc à la découverte de Mono for Android.</p>
<p>Pour information, Mono for Android permet de développer des applications en C#. Il est basé sur le runtime Mono et est propriété de la société <a href="http://www.xamarin.com/">Xamarin </a>.</p>
<p>L&rsquo;interface graphique est basé sur les fichiers axml de l&rsquo;android sdk. Il est donc assez aisé de trouver de la documentation sur la partie graphique sur le <a href="http://developer.android.com/sdk/index.html"> site officiel</a>.</p>
<p><span id="more-5"></span></p>
<p>Ce qui va m&rsquo;intéresser pour le moment c&rsquo;est de comprendre et de détourner la logique du tout asynchrone de l&rsquo;Android SDK qui pour tout dire m’horripile grandement.<br />
L&rsquo;application se décompose en Activity, Widget et d&rsquo;autres choses que je ne connais pas encore.<br />
 -Les Activity sont les écrans de votre application.<br />
 -Les Widgets sont les composants utilisateurs affichés dans les Activity.</p>
<p>Pour ce qui est du développement, vous écrivez du code .Net en C# dans Visual Studio 2010 ou/et MonoDevelop sous Windows/Linux/MacOSX.</p>
<p>Un émulateur existe pour tester vos applications mais il est extrêmement long à la détente tout du moins sous Windows.<br />
La seule solution pour pouvoir développer correctement est d&rsquo;acheter une licence de développement (399 euros pour un développeur).<br />
Je sais que c&rsquo;est cher payé pour développer en C# alors que le développement en Java est totalement gratuit.</p>
<p>La puissance de Xamarin c&rsquo;est que le code hors écran est compatible sous Iphone/IPad. Il suffit de refaire les écrans de vos applications et de fusionner le code métier sous les différentes plateforme.</p>
<p>En poussant le vice, vous pouvez même avec une certaine organisation étendre cette réutilisation de code sous Windows PC/Mobile/Phone.</p>
<p>Par exemple pour mon entreprise, il y a plusieurs années j&rsquo;ai porté une application de vente écrite en C# CF (Windows mobile/CE) sous Windows XP. En réorganisant tout simplement l&rsquo;application, avec une directive de compilation.</p>
<p>Il y a quelques jours, je me suis mis en tête de récidiver en m&rsquo;attaquant à la plateforme Android. Pour ce faire, j&rsquo;ai bien évidemment choisi Mono for Android et après 3 soirées, j&rsquo;ai porté environ 80% du code métier en modifiant moins de 5% de sont code.<br />
Le plus gros changement fut au niveau des requetes vers la base de données. J&rsquo;ai du retravailler les requêtes et les connexions à la base pour utiliser une base SqLite au lieu de SQLCe database.</p>
<p>Une fois le code données et métier portés, je me suis attaqué à l&rsquo;interface graphique et la au mon Dieu &laquo;&nbsp;tout est asynchrone&nbsp;&raquo;</p>
<p>Quel casse tête!</p>
<p>Au fil des entrées du blog, je vous expliquerai comment contourner assez facilement le mode asynchrone pour le rendre synchrone.<br />
Beaucoup d&rsquo;entre vous me dirons que c&rsquo;est une hérésie, moi je parlerai plutôt de logique d&rsquo;application.<br />
Comme je le dis souvent, la simplicité est le maître mot de la durabilité. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
