Y a-t-il un moyen de faire des changements d'interface utilisateur dans un fil non-UI? Question courte. P>
6 Réponses :
Il y a beaucoup de moyen de faire cela, utilisez Asynccc ou threads a>. Réponse courte. p>
indice: les affaires de l'interface utilisateur peuvent être faites dans la classe pré-postexecute / RunonUthRead / Handler Sup> SUB> P>
Découvrez le Handler classe. Ou jetez un coup d'œil à ces questions similaires: P>
Manipulation du code de l'interface utilisateur d'un fil P>
Mise à jour de l'interface utilisateur du fil à l'aide d'AudioTrack P>
Eh bien, le problème fondamental est que ce fil est dans une autre classe que mon activité principale, et cela fait quelque chose dans une boucle infinie (sockets, etc.).
Utilisez manutention ou utiliser ci-dessous code
runOnUiThread(new Runnable() { @Override public void run() { // Ui Stuff here } });
Essayez d'explorer RunonUthRead () P>
Si vous ne voulez pas utiliser un système d'asyncaptage, essayez le motif d'observateur avec une classe intérieure (réponse de réponse) dans votre activité principale, désolé, je ne pouvais pas obtenir la mise en forme, mais je suis sûr que vous obtenez l'idée
public class WorkerThread extends Observable implements Runnable { public void run() { try { DoSomething(); String response = "Doing something"; setChanged(); notifyObservers( response ); DoSomethingElse(); String response = "Doing something else"; setChanged(); notifyObservers( response ); } catch (IOException e) { e.printStackTrace(); } } private void DoSomething(){ } private void DoSomethingElse(){ } public class MainActivity{ public class ResponseHandler implements Observer { private String resp; public void update (Observable obj, Object arg) { if (arg instanceof String) { resp = (String) arg; //Write message to UI here ie System.out.println("\nReceived Response: "+ resp ); //or EditText et = (EditText)findViewById(R.id.blah); // blah.SetText(resp); } } } private void doStuffAndReportToUI(){ final WorkerThread wt = new WorkerThread(); final ResponseHandler respHandler = new ResponseHandler(); wt.addObserver( respHandler ); Thread thread = new Thread(wt); thread.start(); }
J'ai essayé + TMHO réponse, mais cela donne toujours cette erreur:
e / androidruntime (****): Android.View.ViewrooTIMPL $ appeléfromwrongthreadException: Seul le fil d'origine créé une hiérarchie de vue peut toucher ses vues. P> BlockQuote>
Je finis enfin de le combiner avec + itsaurabh Way, comme celui-là: p>
xxx pré> Merci à tous deux. p> p>