2011-02-08 50 views
6

我有一个设计问题在Activity类从一个线程调用类发送进度条的值更新GUI,如下如何从线程传递进度值到活动?

[代码段不进行编译它仅用于解释]:

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再通B类与B类A类的引用可能然后CAL l A中的回调函数(可能传递一个int或其他值来表示进度有多远)。从不同的线程更新UI,UI线程往往会导致问题。幸运的是,Activity类具有“runOnUiThread(Runnable action)”方法。所以要设置进度,你可以这样做:

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

我的太感谢回应我现在要测试它并让你知道结果,**谢谢**。 – 2011-02-08 08:54:03

+0

谢谢Rutger,工作完美。 – 2011-02-08 10:17:57

3

我已经使用了Handler来达到这个效果。在Activity中创建它,您创建ProgressDialog,然后将Handler传入您希望从中获得进度的方法。然后你就可以将消息发送回调用Activity更新进度:

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

我总是用pattre的这种和作品GR8我...

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

    } 
} 
相关问题