2012-07-20 6 views
0

J'écris un client de serveur sur la plate-forme android. Si l'un des clients envoie un message à l'un d'entre eux, le premier message est envoyé au serveur et le serveur l'envoie au client. Quand un client récepteur reçoit le message, je dois setContentView donc j'ai besoin d'ouvrir l'écran de messagerie. Mais il prend les messages dans un fil différent et je passe en référence ma classe d'activité.setContentView dans un thread différent

Thread my = new MyThread(this); 

et dans la classe fil ne peux pas définir l'affichage ı contenu, car donner une erreur comme ViewRoot CalledFromWrongThread que puis-je faire?

+0

Postez votre code afin que nous peut vous aider à le modifier. –

Répondre

2
ActivityName.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // set contentview here 
    } 
}); 
+0

Mais mon thread est une classe différente et fait beaucoup de choses pas seulement le contenu défini. Thread threadReciever = new ThreadRecieve (this); threadReciever.start(); Je le crée de cette façon. alors qu'est-ce que vous suggérez? – Emre

7

L'UIThread est le thread principal d'exécution pour votre application. C'est ici que la majeure partie du code de votre application est exécutée. Tous vos composants d'application (Activités, Services, ContentProviders, BroadcastReceivers) sont créés dans ce thread et tous les appels système à ces applications sont effectués dans ce thread.

Lorsque vous indiquez explicitement un nouveau thread pour travailler en arrière-plan, ce code n'est pas exécuté sur l'UIThread. Alors que se passe-t-il si le thread d'arrière-plan doit faire quelque chose qui change l'interface utilisateur? Ce est ce que le runOnUiThread est pour. En fait, vous êtes censé utiliser un gestionnaire (voir le lien ci-dessous pour plus d'informations à ce sujet); il fournit à ces threads d'arrière-plan la possibilité d'exécuter du code pouvant modifier l'interface utilisateur. Pour ce faire, ils placent le code modifiant l'interface utilisateur dans un objet Runnable et le transmettent à la méthode RunOnUiThread.

(Voir https://stackoverflow.com/a/3653478/448625 pour une explication plus détaillée de ce fil interface utilisateur est)

En bref, cela devrait fixer:

runOnUiThread(new Runnable() { 
    public void run() { 
     // some code that needs to be ran in UI thread 
    } 
}); 
+0

Merci pour votre aide. Thread threadReciever = new ThreadRecieve (this); threadReciever.start(); ceci est mon fil nad quand j'ai le message j'essaye de changer la vision du contenu. Donc vous me conseillez d'utiliser un wrOinUnThread? – Emre

+0

Content de pouvoir aider. S'il vous plaît également envisager d'accepter une réponse si votre question est répondue: http://meta.stackexchange.com/a/5235/172216 – Caner

+0

Je vous recommande de mettre la ligne 'setContentView' dans la méthode' run() 'dans ma réponse – Caner

0
ActivityName.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 

    } 
}); 
Questions connexes