décembre
2011
Il y a quelques jours j’exposai vulgairement ma façon de développer en ansynchrone entre différentes activity.
Aujourd’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 pour accéder de manière unique à mes paramètres (Univers Threadé) nommé mutexParamFrm
- Une fonction de recupération de paramètres généric
- Une fonction de suppression complète de paramètres
- Une fonction d’ajout de paramètres
- Une fonction de calcul du prochain identifiant des activity
La génération des identifiants des activity. Noté que l’objet mutexParamFrm sert à locker l’accès interThread a une seul iteration à la fois.
private static int idFrm = 0;
public static int ProchainIdFrm()
{
int result = 1;
lock (mutexParamFrm)
{
if (idFrm == Int32.MaxValue)
idFrm = 1;
else
idFrm++;
result = idFrm;
}
return result;
}
La classe contenant les paramètres
{
public string Cle = string.Empty;
public object Obj = null;
public ParamFrm()
{
}
public ParamFrm(string cle, object obj)
{
Cle = cle;
Obj = obj;
}
}
La fonction de récupération de paramètres
{
List<ParamFrm> listeParam = null;
if (listeParamDesFrm.ContainsKey(idFrm)) // récupération de la liste des paramètres par rapport à la clé
listeParam = listeParamDesFrm[idFrm];
else
{
listeParam = new List<ParamFrm>(); // génération de la liste si non présent
listeParam.Add(new ParamFrm("mutexfrm", new AutoResetEvent(false))); //ajout auto du mutex pour bloquer les activity parentes
listeParamDesFrm.Add(idFrm, listeParam);
}
return listeParam;
}
public static bool recupParamFrm<T>(int idFrm, string nomParam, out T obj)
{
bool result = false;
obj = default(T);
nomParam = nomParam.ToLower();
lock (lockParamFrm)
{
List<ParamFrm> listeParam = recupListeParamFrm(idFrm);
foreach (ParamFrm paramFrm in listeParam)
{
if (paramFrm.Cle == nomParam) //la cle est toutjours un minuscule
{
result = true;
obj = (T)paramFrm.Obj;
break;
}
}
}
return result;
}
La fonction de vidage des paramètres
{
lock (lockParamFrm)
{
if (listeParamDesFrm.ContainsKey(idFrm))
listeParamDesFrm.Remove(idFrm);
}
}
La fonction d’ajout de paramètres
{
nomParam = nomParam.ToLower();
lock (lockParamFrm)
{
List<ParamFrm> listeParam = recupListeParamFrm(idFrm);
bool trouve = false;
foreach (ParamFrm paramFrm in listeParam)
{
if (paramFrm.Cle == nomParam) //la cle est toutjours un minuscule
{
trouve = true;
paramFrm.Obj = obj;
break;
}
}
if (!trouve)
listeParam.Add(new ParamFrm(nomParam, obj));
}
}
Pour plus de clareté, je lance l’activité « ecran2″ dans sa propre class par la méthode static Afficher:
{
try
{
object obj;
int idFrm = BibFrm.ProchainIdFrm();
if (BibFrm.recupParamFrm(idFrm, BibFrm.nomParamMutexFrm, out obj))
{
BibFrm.ajouteParamFrm(idFrm, "titre", titre);
AutoResetEvent a = (AutoResetEvent)obj;
Intent intent = new Intent(activity, typeof(ecran2));
activity.RunOnUiThread(() =>
{
intent.PutExtra("idfrm", idFrm);
activity.StartActivity(intent);
});
a.WaitOne();
BibFrm.viderParamFrm(idFrm);
}
}
catch
{
}
}
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.
L’itent est utilisé uniquement pour sauvegarder l’identifiant de la fenetre.
Dès lors, le thread est bloqué et attends la fermeture de l’activité.
Pour les plus codeurs d’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é.
Bonne fêtes de fin d’année.
Commentaires récents
- Mono for Android dans
- Mono for Android dans
- [Mono]Asynchrone Mon meilleur ennemi dans