Android fonctionne essentiellement sur deux types de threads, à savoir le thread de l'interface utilisateur et le thread d'arrière-plan. Selon la documentation d'Android -
N'accédez pas à la boîte à outils de l'interface utilisateur d'Android en dehors du thread de l'interface utilisateur. Pour résoudre ce problème, Android propose plusieurs moyens d'accéder au thread de l'interface utilisateur à partir d'autres threads. Voici une liste de méthodes qui peuvent vous aider :
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Il existe aujourd'hui différentes méthodes pour résoudre ce problème. Je vais l'expliquer par un exemple de code
runOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
LOOPER
Classe utilisée pour exécuter une boucle de messages pour un thread. Par défaut, les threads ne sont pas associés à une boucle de messages ; pour en créer une, appelez prepare() dans le thread qui doit exécuter la boucle, puis loop() pour qu'il traite les messages jusqu'à ce que la boucle soit arrêtée.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
AsyncTask
AsyncTask vous permet d'effectuer un travail asynchrone sur votre interface utilisateur. Il effectue les opérations de blocage dans un thread de travail et publie ensuite les résultats sur le thread de l'interface utilisateur, sans que vous ayez à gérer vous-même des threads et/ou des gestionnaires.
public void onClick(View v) {
new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}
}
Manipulateur
Un Handler permet d'envoyer et de traiter les objets Message et Runnable associés à la MessageQueueue d'un thread.
Message msg = new Message();
new Thread()
{
public void run()
{
msg.arg1=1;
handler.sendMessage(msg);
}
}.start();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.arg1==1)
{
//Print Toast or open dialog
}
return false;
}
});