Je sais que je suis un peu en retard mais voilà.
Android fonctionne essentiellement sur deux types de filetage à savoir le thread de l'INTERFACE utilisateur et le thread d'arrière-plan. Selon android documentation -
Ne pas accéder à l'INTERFACE utilisateur Android toolkit de l'extérieur de la thread d'INTERFACE utilisateur pour résoudre ce problème, Android offre plusieurs moyens d'accéder au thread de l'INTERFACE utilisateur à partir d'autres threads. Voici une liste de méthodes qui peuvent aider:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Maintenant, il existe 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 message pour un thread. Threads par défaut ne
pas une boucle de message qui leur sont associés, pour en créer un, appel
prepare() dans le thread qui est l'exécution de la boucle, puis la boucle() à
ont-il traiter les messages jusqu'à ce que la boucle est arrêté.
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 utilisateur
de l'interface. Il effectue les opérations de blocage dans un thread de travail et
puis publie les résultats sur le thread de l'INTERFACE utilisateur, sans vous obliger à
poignée de fils et/ou les gestionnaires de vous-même.
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
}
}
Gestionnaire
Un Gestionnaire vous permet d'envoyer et de traiter le Message et Praticable objets
associé à un thread MessageQueue.
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;
}
});