web-dev-qa-db-fra.com

Différence entre Handler.post (Runnable r) et Activity.runOnUiThread (Runnable r)

Y a-t-il une différence entre

new Handler.post(Runnable r);

et

activity.runOnUiThread(Runnable r)
35
VinceFR

runOnUiThread est essentiellement adapté pour afficher une boîte de dialogue de progression ou effectuer des manipulations d'interface utilisateur avant un appel AsyncTask. Si vous souhaitez mettre à jour l'interface utilisateur au milieu d'une exécution de thread, la meilleure approche consiste à créer un Handler qui mettra à jour votre interface utilisateur et laissera le thread continuer à s'exécuter, par exemple, mettre à jour une vue de texte périodiquement après quelques secondes, dites fonctionnalité de minuterie.

7
Shafi

De la documentation officielle Handler

Gestionnaire

Il existe deux utilisations principales pour un gestionnaire:

(1) Pour planifier les messages et les exécutables à exécuter à un moment donné dans le futur.

(2) Pour mettre en file d'attente une action à effectuer sur un thread différent du vôtre.

En bref, Handler est utilisé pour gérer différents Runnables.

runOnUiThread

Il est utilisé pour exécuter l'opération non-UI sur le thread d'interface utilisateur, par exemple si vous souhaitez mettre à jour l'écran à partir de doInBackground () d'AsyncTask, vous devez écrire la partie de code qui met à jour l'interface utilisateur dans runOnUiThread (). Mais encore une fois, cela bloquera l'interface utilisateur.

19
Lalit Poptani

Un Handler est attaché au thread sur lequel il a été créé.

handler.post(Runnable) peut être utilisé pour exécuter du code sur le thread auquel le gestionnaire est attaché.

Activity.runOnUIThread(Runnable) exécute toujours le runnable donné sur l'UIThread de l'activité. En interne, il le fait via un gestionnaire que Activity crée lorsqu'il est construit comme suit:

final Handler mHandler = new Handler();

Par conséquent, le code runonUiThrad ressemble à ceci:

public final void More ...runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

Comme vous pouvez voir si le thread actuel n'est pas le thread d'interface utilisateur, il publie le runnable donné sur son gestionnaire de membre auquel nous avons fait référence précédemment. Si l'appelant est déjà sur le thread d'interface utilisateur, il appelle simplement l'exécutable.

Rad le code ici .

2
Guy