Je viens de commencer avec le développement Android et que la mise à jour de l'interface utilisateur me dérange vraiment: /
C'est ce que j'ai travaillé jusqu'à présent - P>
package projects.Move; import android.os.Bundle; import android.view.View; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Color; public class Move extends Activity { private float y = 0; private long now = 0; private float delay = 75; private Paint paint = new Paint(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SimpleMotion(this)); paint.setColor(Color.BLACK); } private class SimpleMotion extends View { public SimpleMotion(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { float x = canvas.getWidth() / 2; canvas.drawColor(Color.WHITE); canvas.drawCircle(x, y, 30, paint); if(System.currentTimeMillis() - now > delay) y++; invalidate(); } } }
4 Réponses :
Vous pouvez utiliser asyncktask fort> pour le filetage, les bases: Filetage indolore , Exemple: multithreading pour Performance . P>
Pour mettre à jour les gestionnaires de mise à jour de l'interface utilisateur, consultez Ce a >. Chaque fois que vous souhaitez mettre à jour UI, vous envoyez un message du fil à votre fil d'interface utilisateur principal. P>
Eh bien, la première question est - pourquoi voulez-vous faire vos graphiques dans un fil séparé? Parce que sauf si vous faites des choses spécifiques (principalement dans le domaine des jeux ou des médias), vous allez vous retrouver dans beaucoup de douleur avec peu d'avantages si vous essayez de le faire. P>
Votre pourrait vous retrouver avec beaucoup d'appels inutiles à invalider () (et donc redessinés) avec le code que vous fournissez. Serait préférable de déclencher le changement du paramètre Y (et de l'invalidation) avec un gestionnaire, que vous pouvez également tirer le feu. P>
Eh bien, je suppose qu'il y a une certaine confusion ici. Vous devez faire vos mises à jour d'interface graphique du fil principal (également appelé thread de l'interface graphique) - sinon vous obtenez quelque chose comme «Exception, BLABLA a fui une vue».
Je suppose que ce qui a mal compris, c'est que les opérations coûteuses, telles que La mise en réseau doit être faite dans un fil différent de celui du fil principal. Et si vous souhaitez mettre à jour l'interface graphique du fil du réseau, vous le feriez en tant qu'OroworkAd dit (ou dit ses liens). P>
Donc, pour ce que vous voulez faire, vous pourriez obtenir avec quelque chose comme le remplacement de votre SimpleMemotion classe avec les suivantes: p> avec votre ancien code d'avoir La partie importante du nouveau code est Invalidate () code> dans
Ondraw () Code> Vous serez continuellement Redessinez l'interface graphique même s'il n'y a aucun changement. P>
postinvalidate () code>. Cela permet de dire au fil de l'interface graphique - d'un autre fil - de redessiner l'interface graphique. P> P>
BTW, puisque vous êtes nouveau dans les threads, vous devriez les lire sur eux. Et assurez-vous de les arrêter lorsque vous n'en avez pas besoin de courir. Sinon, il continuera à courir en arrière-plan même si vous appuyez sur "Retour" ou "Accueil".
Merci, ce que je cherchais. Puis-je supposer que la fonction postinvalidate () désigne toujours le fil d'interface utilisateur principal, donc où que vous l'appeliez dans le projet, il appellera la fonction ONDRAW () de votre UI principale?
Le temps d'édition est up: après plus d'autres pensées évidemment, il ne peut pas faire référence au fil principal de l'UI tout le temps. Alors, comment allez-vous faire référence à une vue dans une autre classe par exemple?
Eh bien, j'étais quelque chose qui me dise dans ma réponse. Mais invalider simplement une vue spécifique invalide. Une vue peut être un bouton, une case à cocher ou comme dans votre cas une vue personnalisée. Une activité peut exister de nombreuses vues. Donc, pour mettre à jour (ou plutôt invalider) une vue spécifique à partir d'un autre thread, vous obtiendriez d'abord la vue comme "BOUTON BTN = (bouton) FOYVISHYID (r.id.button);" puis appelez btn.postinvalidate ();