[Android] Les threads
Soumis par cigolabs le 14 juin, 2011 - 08:12
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.
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.