2013-03-28 17 views

risposta

19

Esistono diversi modi per aggiornare l'interfaccia utente e modificare uno View come un TextView dall'esterno del thread dell'interfaccia utente. A Handler è solo un metodo.

Ecco un esempio che consente a un singolo Handler di rispondere a vari tipi di richieste.

a livello di classe definiscono un semplice Handler:

private final static int DO_UPDATE_TEXT = 0; 
private final static int DO_THAT = 1; 
private final Handler myHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     final int what = msg.what; 
     switch(what) { 
     case DO_UPDATE_TEXT: doUpdate(); break; 
     case DO_THAT: doThat(); break; 
     } 
    } 
}; 

aggiornare l'interfaccia utente in una delle vostre funzioni, che è ora sul thread UI:

private void doUpdate() { 
    myTextView.setText("I've been updated."); 
} 

Dall'interno vostro compito asincrona, invia un messaggio allo Handler. Ci sono molti modi per farlo. Questo può essere il più semplice:

myHandler.sendEmptyMessage(DO_UPDATE_TEXT); 
+3

Che dire di 'classe Handler deve essere statico altrimenti le perdite di memoria potrebbero occur' avvertimento? – nmxprime

+1

si prega di trovare il [** Blog post **] (http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html) e questa risposta (http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-happen-incominghandler) per avere maggiori informazioni su questo –

+0

raccomando weakHandler qui per evitare perdite. https://github.com/badoo/android-weak-handler – j2emanue

2

è possibile anche aggiornare thread dell'interfaccia utente dal thread in background in questo modo anche:

Handler handler = new Handler(); // write in onCreate function 

//below piece of code is written in function of class that extends from AsyncTask 

handler.post(new Runnable() { 
        @Override 
        public void run() { 
         textView.setText(stringBuilder); 
        } 
       }); 
Problemi correlati