我遇到一个设计问题,从活动类中的Thread调用的类中发送进度条值以更新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
}
}
}
非常感谢任何帮助或指南
答案 0 :(得分:3)
我用Handler
来达到这个效果。在您创建Activity
的{{1}}中创建它,然后将ProgressDialog
传递到您想要获得进度的maethod中。然后,您可以将消息发送回调用Handler
以更新进度:
Activity
答案 1 :(得分:3)
我总是使用这种格式,并为我工作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);
}
}
}
答案 2 :(得分:2)
你可以在类A中创建一个updateProgressBar方法,然后向类B传递对类A的引用。然后,类B可以调用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);
});
}