Que fait exactement la méthode post?

J’ai rencontré une caractéristique très étrange.

Lorsque j’essaie d’exécuter une animation sur le thread principal, elle ne démarre pas. Lorsque je lance cette animation en utilisant

getView().post(new Runnable() { @Override public void run() { getView().startAnimation(a); } }); 

Ça commence

J’ai imprimé le CurrentThread avant de commencer l’animation et les deux imprimer.

De toute évidence, il me manque quelque chose ici, car les deux devraient commencer l’animation sur le thread principal … Je suppose que comme post ajoute la tâche à la queue, il commence à une “heure correcte”, mais j’aimerais savoir ce qui se passe ici plus en profondeur

EDIT: Permettez-moi de clarifier les choses – ma question est la suivante: pourquoi le démarrage de l’animation sur un message le fait démarrer, alors que le démarrage de l’animation sur le thread principal ne le fait pas.

post : post provoque l’ajout de Runnable dans la queue des messages,

Runnable: représente une commande pouvant être exécutée. Souvent utilisé pour exécuter du code dans un autre thread.

run () : Lance l’exécution de la partie active du code de la classe. Cette méthode est appelée au démarrage d’un thread créé avec une classe qui implémente Runnable.

 getView().**post**(new **Runnable**() { @Override public void run() { getView().startAnimation(a); } }); 

code : getView().startAnimation(a);

dans votre code,

post provoque le Runnable (le code sera exécuté dans un thread différent) pour append la queue des messages.

Donc, startAnimation sera lancé dans un nouveau thread quand il sera extrait du messageQueue

[EDIT 1]

Pourquoi utilisons-nous un nouveau thread au lieu d’un thread d’interface utilisateur (thread principal)?

Fil de l’interface utilisateur:

  • Lorsque l’application est lancée, Ui Thread est créé automatiquement

  • Il est chargé d’envoyer les événements aux widgets appropriés, y compris les événements de dessin.

  • C’est aussi le thread avec lequel vous interagissez avec les widgets Android avec

Par exemple, si vous appuyez sur le bouton a l’écran, le thread d’interface utilisateur dissortingbue l’événement tactile au widget qui, à son tour, définit son état activé et publie une demande d’invalidation dans la queue des événements. Le thread d’interface utilisateur désenregistre la demande et avertit le widget de se redessiner.

Que se passe-t-il si un utilisateur appuie sur un bouton qui fera une opération longue?

 ((Button)findViewById(R.id.Button1)).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { final Bitmap b = loadImageFromNetwork(); mImageView.setImageBitmap(b); } }); 

L’interface utilisateur se fige. Le programme peut même tomber en panne.

 public void onClick(View v) { new Thread(new Runnable() { public void run() { final Bitmap b = loadImageFromNetwork(); mImageView.setImageBitmap(b); } }).start(); } 

Il casse la règle Android qui ne met jamais à jour l’interface utilisateur directement à partir du thread de travail

Android propose plusieurs façons d’accéder au thread d’interface utilisateur à partir d’autres threads.

  • Activity.runOnUiThread (Runnable)
  • View.post (Runnable)
  • View.postDelayed (Runnable, long)
  • Manutentionnaire

Comme ci-dessous,

View.post (Runnable)

 public void onClick(View v) { new Thread(new Runnable() { public void run() { final Bitmap b = loadImageFromNetwork(); mImageView.post(new Runnable() { public void run() { mImageView.setImageBitmap(b); } }); } }).start(); } 

Manutentionnaire

 final Handler myHandler = new Handler(); (new Thread(new Runnable() { @Override public void run() { final Bitmap b = loadImageFromNetwork(); myHandler.post(new Runnable() { @Override public void run() { mImageView.setImageBitmap(b); } }); } })).start(); } 

entrer la description de l'image ici

Pour plus d’informations

http://android-developers.blogspot.com/2009/05/painless-threading.html

http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/

Est-ce que cela se fait sur onCreate ou onCreateView? Si tel est le cas, l’application peut ne pas être dans un état où la vue est attachée à la fenêtre. De nombreux algorithmes basés sur les mésortingques View peuvent ne pas fonctionner car des éléments tels que les mesures et la position de la vue peuvent ne pas avoir été calculés. Les animations Android nécessitent généralement qu’elles s’exécutent dans les mathématiques de l’interface utilisateur

View.post met en queue l’animation sur la boucle de message de la vue. Une fois la vue attachée à la fenêtre, elle exécute l’animation au lieu de l’exécuter manuellement.

Vous utilisez actuellement des éléments sur le thread d’interface utilisateur, mais à un moment différent

Regardez ici pour une bonne réponse. view.post () est la même chose que handler.post () à peu près. Il entre dans la queue du thread principal et est exécuté une fois les autres tâches en attente terminées. Si vous appelez activity.runOnUiThread (), il sera appelé immédiatement sur le thread d’interface utilisateur.

Je pense que le problème pourrait être la méthode du cycle de vie où vous appelez la méthode post (). Est-ce que vous le faites dans onCreate ()? Si oui, regardez ce que j’ai trouvé dans la documentation onResume () de l’activité:

pour résumer()

Ajouté dans l’API niveau 1 void onResume () Appelé après onRestoreInstanceState (Bundle), onRestart () ou onPause (), pour que votre activité commence à interagir avec l’utilisateur. C’est un bon endroit pour commencer les animations , ouvrir des dispositifs d’access exclusif (tels que la caméra), etc.

https://developer.android.com/reference/android/app/Activity.html#onResume ()

Ainsi, comme Joe Plante l’a dit, la vue n’est peut-être pas prête à lancer des animations au moment où vous appelez post (), alors essayez de la déplacer sur onResume ().

PD: En fait, si vous déplacez le code sur onResume (), je pense que vous pouvez supprimer l’appel post () puisque vous êtes déjà dans le thread ui et que la vue doit être prête à démarrer des animations.