Mettre à jour la Vue lors de l'exécution Android
L'exemple est assez simple: je veux laisser l'utilisateur de savoir à propos de ce que fait l'application sur simple présentation d'un texte (de la toile.drawText()). Ensuite, mon premier message s'affiche, mais pas pour les autres. Je veux dire, j'ai un "setText" méthode, mais elle n'a pas les mises à jour.
onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(splash); //splash is the view class
loadResources();
splash.setText("this");
boundWebService();
splash.setText("that"):
etc();
splash.setText("so on");
}
Le point de vue du texte de dessin fonctionne en faisant juste un drawText dans onDraw();, de sorte setText modifications au texte, mais ne le montrent pas.
Quelqu'un m'a recommandé de remplacer la vue avec une SurfaceView, mais il serait beaucoup de problèmes pour juste un couple de mises à jour, DONC... comment diable puis-je mettre à jour la vue dinamically au moment de l'exécution?
Il devrait être assez simple, il suffit de montrer un texte pour dire 2 secondes, puis le thread principal de faire son truc et puis mise à jour du texte...
Merci!
Mise à jour:
J'ai essayé la mise en œuvre de gestionnaire.onPost(), mais c'est la même histoire une fois de plus. Permettez-moi de vous mettre le code:
public class ThreadViewTestActivity extends Activity {
Thread t;
Splash splash;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
splash = new Splash(this);
t = new Thread(splash);
t.start();
splash.setTextow("OA");
try { Thread.sleep(4000); } catch (InterruptedException e) { }
splash.setTextow("LALA");
}
}
Et:
public class Splash implements Runnable {
Activity activity;
final Handler myHandler = new Handler();
public Splash(Activity activity) {
this.activity=activity;
}
@Override
public void run() {
//TODO Auto-generated method stub
}
public synchronized void setTextow(final String textow) {
//Wrap DownloadTask into another Runnable to track the statistics
myHandler.post(new Runnable() {
@Override
public void run() {
TextView t = (TextView)activity.findViewById(R.id.testo);
t.setText(textow);
t.invalidate();
}
});
}
}
Bien que splash est dans l'autre thread, j'ai mis un profond sommeil sur le thread principal, j'utilise le gestionnaire pour gérer l'INTERFACE utilisateur et tout, il ne change plus d'une chose, il n'affiche que la dernière mise à jour.
OriginalL'auteur ferostar | 2010-12-21
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas touché encore, mais je pense que le schéma habituel consiste à faire de longues initialisation dans un thread d'arrière-plan, et l'utilisation
Handler.post()
de mettre à jour l'INTERFACE utilisateur. Voir http://developer.android.com/reference/android/widget/ProgressBar.html pour un autre, mais peut-être liées, par exemple.Voir aussi cette réponse, surtout le premier paragraphe:
Mise à jour (en fonction de votre mise à jour et de ton commentaire): Vous n'êtes pas censé mise à jour de l'INTERFACE utilisateur dans n'importe quel thread, à l'exception de celui où votre Activité est créée. Pourquoi est-il impossible pour vous de charger vos ressources dans un thread d'arrière-plan?
OriginalL'auteur Dan Breslau
Première:
onCreate
est exécuté sur le main thread de l'INTERFACE utilisateur de l'application donc pas de mises à jour de l'INTERFACE utilisateur jusqu'à ce que vous le quittez. Fondamentalement, vous avez besoin d'un thread à exécuter les tâches longues et d'un mécanisme de pousser les mises à jour dans l'INTERFACE utilisateur.La plupart approche habituelle consiste à étendre AsyncTask voir ce lien pour plus d'info
OriginalL'auteur Nikolay Ivanov
je pense que votre point de vue est une vue étendue et que vous appelez onDraw pour le dessin de la vue, de sorte que, peut-être que la vue n'est pas "actualiser" de leur état, alors essayez cette
eh bien, maintenant, au lieu de dessiner des le premier le point de vue, le tirage de la dernière, vos opérations (loadResources()...etc) courir trop vite? mettre un Journal.(i) l'entrée sur votre méthode de tirage pour voir ce texte est le dessin, je suppose que la vue est le dessin de tous les textes...
Rien n'indique dans le logcat bien que je suis entré dans le Journal.j'(splashText) à l'intérieur de onDraw.
OriginalL'auteur Franco