2010-11-10 4 views
1

J'essaie de télécharger des images et de les afficher dans une grille 5x5, et je veux que chaque image apparaisse dès qu'elle est téléchargée. J'ai un VerticalFieldManager, et j'ajoute 5 HorizontalFieldManager s. Comme je télécharge chaque image (en utilisant HttpConnection), je le convertis en Bitmap puis placez-le dans un BitmapField puis ajoutez le champ à l'un des HorizontalFieldManager s.Comment rafraîchir les champs pendant une activité dans une boucle?

Cela fonctionne, sauf que je ne vois aucune des images jusqu'à ce que 25 ont été téléchargées, à quel point je les vois tous.

J'ai essayé d'appeler invalidate() sur tout ce qui est impliqué après le téléchargement de chaque image, mais cela ne semble pas avoir d'effet.

Répondre

2

Etes-vous en train de télécharger le fil de l'événement de l'interface utilisateur? Sinon, le téléchargement bloquera toutes les mises à jour de l'interface utilisateur jusqu'à la fin, ce qui expliquerait le comportement que vous voyez.

modifier en fonction des nouvelles informations dans le commentaire:

HttpConnection bloque, vous devez donc faire l'opération IO sur un filetage extérieur du thread d'interface utilisateur. Votre application télécharge les images assez rapidement pour que le blocage du thread de l'interface utilisateur ne tue pas toute l'application. Sur une connexion lente, votre application serait tuée par le système d'exploitation pendant ces téléchargements.

Cette interface effectue des opérations d'entrée et de sortie bloquantes. Une application se verrouille si une implémentation de cette interface ouvre une connexion à partir du thread d'événement principal. Empêcher une application de se verrouiller en ouvrant une connexion depuis un thread distinct du thread d'événement principal. SeeConnector pour plus d'informations.

+0

Oui, mais chaque téléchargement est séparé (créer et utiliser un autre objet HttpConnection pour chaque image). Ce que j'essaie de faire est de mettre à jour l'interface utilisateur après chaque téléchargement. Je suppose que j'ai besoin d'appeler quelque chose comme Windows 'DoEvents, qui permet d'envoyer tous les messages liés à l'interface utilisateur en attente. – MusiGenesis

2

1) Vous devez télécharger et créer BitmapField sur une interface distincte (non-interface utilisateur) Thread.

2) Lorsque vous avez un BitmapField à ajouter, puis faire quelque chose comme ceci:

final BitmapField b = ... // your code to get the BitmapField 
UiApplication.getUiApplication().invokeAndWait(new Runnable() { 
    public void run() { 
     yourContainer.add(b); 
     yourContainer.invalidate(); // may not need this - try comment out 
    } 
}); 
Questions connexes