web-dev-qa-db-fra.com

Différence entre Android runOnUiThread et le code simple en java

Je suis un débutant dans le développement d'applications Android.Je travaille avec des threads dans Android.J'ai lu un runOnUiThread qui exécute le code sur l'interface principale (si je ne me trompe pas? Je suppose.).

Ma question est quelle est la différence entre le code normal sur l'interface utilisateur principale et le code à l'intérieur de runOnIUThread.

Exemple 1

class A
{
getDataFromServer(foo);//Code on mainUI
}

Exemple: 2  

getActivity.runOnUiThread(new Runnable(){
@Override
public void run(){
getDataFromServer(foo);
}
});

Quelle est la différence dans les deux exemples.Veuillez m'aider. Votre réponse sera un nouvel apprentissage pour moi.

8
Mohit Gaur

En supposant que vous vouliez dire code simple pour le code UIThread,

Qu'est-ce qu'un fil?

Un thread définit un processus en cours d'exécution

Premier runOnUiThread ..

Exécute l'action spécifiée sur le thread UI . Si le fil actuel est le thread d'interface utilisateur, alors l'action est exécutée immédiatement. Si le courant thread est pas le thread d'interface utilisateur, l'action est publiée dans la file d'attente des événements du fil de l'interface utilisateur.

Qu'est-ce que UIThread

  • Fil d'exécution principal de votre application
  • La plupart de votre code d'application fonctionnera ici onCreate, onPause, onDestroy, onClick, etc.

    Donc, tout simplement Tout ce qui provoque la mise à jour ou la modification de l'interface utilisateur doit se produire sur le thread d'interface utilisateur

Lorsque vous explicitement créez un nouveau thread pour travailler dans background , ce code n'est pas exécuté sur le UIThread. Maintenant, que faire si vous voulez faire quelque chose qui change l'interface utilisateur? Alors vous êtes invités à runOnUiThread

Vous devez utiliser runOnUiThread() lorsque vous souhaitez mettre à jour votre interface utilisateur à partir d'un thread non-UI. Par exemple, si vous souhaitez mettre à jour votre interface utilisateur à partir d'un thread en arrière-plan. Vous pouvez également utiliser Handler pour la même chose.

13
Charuක

Normalement, votre code est exécuté sur votre thread d'interface utilisateur. Pour les tâches plus longues (telles que les requêtes réseau, etc.), vous utiliserez des tâches en arrière-plan (gestionnaire, AsyncTask, Thread, ...).

Comme vos vues ne peuvent être touchées qu'à partir d'un thread d'interface utilisateur, vous utilisez runOnUiThread() si vous exécutez du code dans un thread d'arrière-plan et vous devez mettre à jour vos vues à partir de ce thread d'arrière-plan.

2
Tobias

Pour expliquer «pourquoi» Android dispose de l'option 'runOnUiThread ()', il est important de comprendre que Java n'est utilisé que pour créer le bytecode (dex) utilisé par Android. Le code exécuté sur le téléphone n'est pas Java. 

De plus, les threads Android "peuvent" avoir une chose appelée "looper". C'est ce "looper" qui gère les "tâches (techniquement exécutables et messages)" dans l'ordre via une file d'attente. Le "fil principal de l'interface utilisateur" est associé par défaut à un boucleur. 

Cela signifie que votre exécutable que vous avez créé a été placé dans la file d'attente du boucleur du thread d'interface utilisateur principal. (c'est pourquoi le runnable n'est PAS exécuté instantanément, mais sera exécuté 'rapidement'/'bientôt') 

Si vous utilisiez un exécutable pour exécuter du code sur le thread d'interface utilisateur, c'est parce que vous vous trouvez dans un autre "thread d'arrière-plan" que vous avez créé ... et que vous souhaitez mettre à jour l'interface utilisateur d'une manière ou d'une autre. (Seul le fil de l'interface utilisateur peut interagir avec l'interface utilisateur) 

1
mawalker