J'ai lu de nombreuses questions concernant ce sujet, mais je n'ai trouvé aucune réponse directe qui puisse répondre à ma question très simple : Les handlers créent-ils réellement de nouveaux threads ou créent-ils simplement un handler pour le même thread que celui à partir duquel ils ont été créés ? Dans la documentation d'Android, ils sont mentionnés :
"Chaque instance de Handler est associée à un seul thread et à la file d'attente de messages de ce thread. Lorsque vous créez un nouveau Handler, il est lié au thread / à la file d'attente de messages du thread qui le crée -- à partir de ce moment, il délivrera des messages et des runnables à cette file d'attente de messages et les exécutera au fur et à mesure qu'ils sortiront de la file d'attente de messages."
Et puis ils mentionnent aussi sur la même page :
"Il y a deux utilisations principales pour un Handler : (1) pour planifier des messages et des runnables à exécuter à un moment donné dans le futur ; et (2) pour mettre en file d'attente une action à exécuter sur un thread différent du vôtre".
Je ne sais pas s'ils veulent dire que le Handler crée réellement de nouveaux threads qui peuvent communiquer avec le thread à partir duquel ils ont été créés (par exemple, à partir du thread UI) OU qu'ils permettent à différents threads de communiquer avec le thread UI si le Handler a été créé à partir du thread UI ?
Par exemple, dans ma MainActivity et dans la fonction onCreate(), je fais ceci :
public class MainActivity extends ActionBarActivity {
private static final String TAG = "MyApp: " + MainActivity.class.getSimpleName();
private Handler mHandler;
private Runnable mRunnable = new Runnable() {
public void run() {
// do something
processData();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate");
mHandler = new Handler();
mHandler.post(mRunnable);
.....
Suis-je en train de créer un nouveau thread ici, indépendant du thread de l'interface utilisateur, qui exécutera la fonction (processData) ? Si je ne crée pas un nouveau thread, quelle serait alors la différence entre mon code ci-dessus et le simple appel de la fonction (processData) sans avoir besoin de créer un gestionnaire, comme suit :
public class MainActivity extends ActionBarActivity {
private static final String TAG = "MyApp: " + MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate");
processData();
.....
Merci beaucoup.
Anmar