2011-02-08 9 views
6

Sto avendo un problema di progettazione l'invio di valore barra di avanzamento da classe chiamata da un thread in Classe di attività per aggiornare l'interfaccia grafica, come la seguenteCome passare il valore di avanzamento da thread a attività?

[Il frammento di codice non compilazione è per spiegare solo]:

Class A : Extend Activity { 
    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      B objB = new B(); 
      objB.DownloadFile(); 
     } 
    }).start(); 
} 

Class B { 
    public void DownloadFile() 
    { 
     ... some work [preparing SOAP request] 
     while(response.read()) 
     { 
     //send calculated progress to Class A to update the progress value 
     } 

    } 

} 

Qualsiasi aiuto o guida sarebbe molto apprezzato

risposta

2

Si potrebbe fare un metodo UpdateProgressBar in classe a e classe B quindi passare un riferimento alla classe A. classe B potrebbe allora cal l la funzione di callback in A (probabilmente passa un int o qualcosa per indicare quanto è lontano il progresso). Aggiornare l'interfaccia utente da un thread diverso, quindi il thread dell'interfaccia utente tende a causare problemi. Fortunatamente la classe Activity ha il metodo "runOnUiThread (Azione eseguibile)". Quindi, per impostare i progressi si potrebbe fare qualcosa di simile:

while(response.read()){ 
    //do stuff here 
int progress = getProgress(); //set the progress to something 
    a.runOnUiThread(new Runnable(){ 
    a.updateProgress(progress); 
    }); 
} 
+0

Sono così grato per la risposta sto andando a testarlo proprio ora e ti faccio sapere il risultato, ** grazie **. –

+0

Grazie Rutger, ha funzionato perfettamente. –

+0

Felice di sentirlo. L'altra ansewr postata da Dave potrebbe essere una soluzione più ordinata. Non sapevo nulla della Classe Handler. Alla fine penso che faccia grosso modo la stessa cosa. – Rutger

3

ho usato un Handler per ottenere questo effetto. Crealo nello Activity in cui crei lo ProgressDialog, quindi passa lo Handler nella sequenza da cui desideri ottenere il progresso. Quindi è possibile inviare un messaggio al chiamante Activity per aggiornare lo stato di avanzamento:

public class ClassA extends Activity { 
    ... 
    private static final int HANDLER_MESSAGE_PERFORM_DIALOG_UPDATE = 0; 
    ... 
    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      B objB = new objB(); 
      objB.DownloadFile(handler); 
     } 
    }).start(); 
    ... 
    private Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      switch(msg.what){ 
      case Constants.HANDLER_MESSAGE_PERFORM_DIALOG_UPDATE: 
       progress.setProgress(msg.arg1); 
       break; 
      default: 
       Log.w("TAG_NAME","handleMessage/Message type not recognised/msg.what = "+String.valueOf(msg.what)); 
      } 
     } 
    }; 
} 

Class B 
{ 
    public void DownloadFile(Handler handler) 
    { 
     ... some work [preparing SOAP request] 
     while(response.read()) 
     { 
     //send calculated progress to Class A to update the progress value 
      sendMessage(handler,HANDLER_MESSAGE_PERFORM_DIALOG_UPDATE,progress); 
     } 
    } 
    private void sendMessage(Handler handler,int what, int arg1){ 
     Message msg = Message.obtain(); 
     msg.what = what; 
     msg.arg1 = arg1; 
     handler.sendMessage(msg); 
    } 
} 
+0

grazie per la risposta, sto testando questo al più presto e vedere se è più affidabile della prima risposta, grazie per entrambi. –

3

Io uso sempre questo tipo di pattre e funziona gr8 per me ...

class A{ 
    new Thread(new Runnable() 
    { 
      public void run() 
      { 
      B objB = new B(new ListnerClass()); 
      objB.DownloadFile(); 
      } 
    }).start(); 

    class ListnerClass implements B.ValueListner{ 
     update(int v){ 
      doWork(); 
     } 
    } 


} 

class B{ 

    ValueListner listner; 

    interface ValuListner{ 
     update(int i); 
    } 
    B(ValueListner listner){ 
     this.listner = listner; 
    } 
    public void DownloadFile() 
     { 
      ... some work [preparing SOAP request] 
     while(response.read()) 
     { 
      listner.update(value); 
     } 

    } 
} 
Problemi correlati