9
votes

Faire des affaires d'interface utilisateur android dans le fil non-UI

Y a-t-il un moyen de faire des changements d'interface utilisateur dans un fil non-UI? Question courte.


0 commentaires

6 Réponses :



1
votes

1 commentaires

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.).



10
votes

Utilisez manutention ou utiliser ci-dessous code

    runOnUiThread(new Runnable()
    {           
        @Override
        public void run()
        {
            // Ui Stuff here                
        }
    });


0 commentaires


5
votes

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();
}


0 commentaires

0
votes

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.

Je finis enfin de le combiner avec + itsaurabh Way, comme celui-là: xxx

Merci à tous deux.


0 commentaires