[Android] Les threads

 

Les threads sous Android. Contrairement à WindowsPhone7 basé sur Silverlight, les appels sont synchrones.
Pour les opérations longues, il faut donc  passer par des threads et ces fameuses erreurs de "cross-thread access" (c’est multi-plateformes).


//La fenêtre d'attente en varaible privé
private Dialog _dialog;

/** Construction de la fenêtre */
@Override
public void onCreate(Bundle savedInstanceState)
{     
    super.onCreate(savedInstanceState);

    //fenêtre d'attente
    _dialog = ProgressDialog.show(this, "", getString(R.string.lbl_chargement), true);

    //Création du thread par l'UI thread
    new Thread(new Runnable()
    {       
        public void run()
        {
            OperationLongue();                   
        }
    }).start();
   
}

/** Mon opération longue (Calculs, Récupération de données sur le web ... */
public void OperationLongue()
{
    runOnUiThread(new Runnable()
    {       
        public void run()
        {
            //Opération longue...
            int i = 1 + 1;
           
            //On aura accès ici à la fenêtre sans erreur de cross thread access.
            EditText txtLogin = (EditText)findViewById(R.id.txtLogin);
            txtLogin.setText(i);
           
            //On enlève la barre de progression
            if(_dialog != null)
                _dialog.dismiss();
        }
    });
}

Par contre si votre application supporte le passage du mode paysage au mode portrait, vous aurez une erreur au basculement si la fenêtre d'attente est toujours affichée.
En effet l'activité sera recrée, on repassera dans le "OnCreate" et on lancera un second thread avant que le premier soit terminé.
Il existe une manière relativement simple dans 90% des cas : dans l'androidManifest.xml puis dans l'activité il faut rajouter orientation dans "Config Changes".
Cela aura pour effet de ne pas détruire l'activité et laissera votre thread se terminer tranquillement.

Après il existe bien sûr d'autres techniques, mais celle-ci comporte l'avantage d'être assez simple à mettre en place et au final efficace.
© 2011 Copyright cigo-developpement.fr