2011-02-08 12 views
6

Mam problem projektowania wysyłania postępu wartość bar z klasy o nazwie z wątku w klasie Aktywny zaktualizować GUI, jak na poniższymJak przekazać wartość postępu z wątku do działania?

[Fragment kodu nie skompilować to dla wyjaśnienia tylko]:

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 
     } 

    } 

} 

Każda pomoc lub podręcznik byłoby bardzo mile widziane

Odpowiedz

2

można zrobić metodę updateProgressBar w klasie a, a następnie przekazać Klasa b odniesienie do klasy A. Klasa b może następnie cal l funkcja zwrotna w A (prawdopodobnie przekazać int lub coś, co wskazuje, jak daleko postępuje). Uaktualnianie interfejsu użytkownika z innego wątku powoduje, że wątek interfejsu użytkownika powoduje problemy. Na szczęście klasa Activity ma metodę "runOnUiThread (Runnable action)". Tak ustawić postęp mógłby zrobić coś takiego:

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

Jestem tak wdzięczny za Odpowiedź mam zamiar przetestować teraz i dać znać wynik, ** dzięki **. –

+0

Dziękuję Rutger, działał idealnie. –

+0

Miło to słyszeć. Inne ansewr opublikowane przez Dave może być jednak lepszym rozwiązaniem. Po prostu nie wiedziałem o klasie Handlerów. W końcu myślę, że robi to z grubsza to samo. – Rutger

3

Użyłem Handler aby osiągnąć ten efekt. Utwórz go w numerze , w którym utworzysz ProgressDialog, a następnie przekaż Handler do metody, z której chcesz uzyskać postęp. Następnie można wysłać z powrotem do wywołującego Activity zaktualizować toku:

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

dziękuję za odpowiedź, testuję to tak szybko, jak to możliwe i sprawdzam, czy jest bardziej wiarygodna niż pierwsza odpowiedź, dziękuję za was obu. –

3

zawsze korzystać z tego rodzaju pattre i działa gr8 dla mnie ...

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

    } 
} 
Powiązane problemy