2011-02-08 17 views
6

私は[コードスニペットは、それだけで説明するためだコンパイルされません]以下進行状況の値をスレッドからアクティビティに渡すにはどうすればよいですか?

として、GUIを更新するために、Activityクラスでのスレッドから呼び出されたクラスからのプログレスバーの値を送信する設計上の問題が生じています:

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 
     } 

    } 

} 

任意のヘルプまたはガイドが大幅

答えて

2

を理解されるであろうあなたは、クラスAにおけるupdateProgressBar法を行い、その後、クラスAクラスBを参照することができ、その後CALクラスBを渡すことができl Aのコールバック関数(おそらくintを渡すか、どれくらい進捗があるかを示すもの)。 UIを別のスレッドから更新すると、UIスレッドは問題を引き起こす傾向があります。幸いにも、Activityクラスにはメソッド "runOnUiThread(Runnable action)"があります。私はこの効果を達成するためにHandlerを使用しました

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

:その後、進捗状況を更新するために呼び出すActivityに戻ってメッセージを送信することができますレスポンス私は今すぐテストし、結果を知ってもらいます** **ありがとうございます**。 –

+0

Rutgerありがとう、完璧に働いた。 –

+0

それを聞いてうれしいです。 Daveによって投稿された他のansewrはもう少しの解決策かもしれません。私はちょうどハンドラークラスについて知りませんでした。 最終的に私はそれがおおよそ同じことをすると思います。 – Rutger

3

:だからあなたのような何かができるの進捗状況を設定します。 ProgressDialogを作成したActivityに作成し、進捗状況を取得する方法にHandlerを渡します。私はのためにとても感謝しています、私はいつもpattreのこの種を使用して、私のためGR8の作品

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

応答をありがとう、私はできるだけ早くこれをテストしていると、それは第一の答えよりも信頼できるかどうかを確認し、両方のおかげで。 –

3

...

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

    } 
} 
関連する問題