Une question sur Android runnable
Question
J'ai vu un morceau de code en ligne. Je me demande pourquoi nous avons besoin d'utiliser runnable au texte ensemble de TextView? Merci!
while (true) {
// listen for incoming clients
Socket client = serverSocket.accept();
handler.post(new Runnable() {
@Override
public void run() {
serverStatus.setText("Connected.");
}
});
La solution
Cette application est multi-thread, est-ce pas? Dans ce cas, un seul thread peut effectuer des opérations sur l'interface utilisateur - le thread d'interface utilisateur. Si vous ne créez pas manuellement de nouveaux threads, alors vous n'avez pas à vous inquiéter à ce sujet. Une fois que vous commencez un nouveau thread vous et vous le souhaitez, vous devez le faire faire l'interface utilisateur de quelque chose lié (comme le texte de mise à jour du serverStatus champ texte) sur un fil interface utilisateur. Ne pas respecter cette règle entraînera une exception.
Handlers sont utilisés comme un moyen de transmettre des messages entre les fils. Dans ce cas, le thread d'interface utilisateur a un gestionnaire qui a été envoyé en tant que paramètre lors de la création serveur-fil. Chaque fois qu'il a besoin de mettre à jour l'interface utilisateur, il affiche un message au thread d'interface utilisateur, qui vérifie périodiquement de nouveaux messages et exécute runnables attachés.
Voici un autre lien (avec exemple) qui pourraient vous aider à comprendre un peu mieux: http://developer.android.com/guide/appendix/faq/commontasks.html#threading
Autres conseils
Ce morceau de code est en fil de serveur. UI (dans ce cas edittext) ne peut être mis à jour dans le Uithread. Runnable vous ramène au thread d'interface utilisateur. Référence: http://developer.android.com /reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)