2011-12-20 59 views
2

关于线程的问题并不缺乏,但我知道,但我似乎无法找到一个线程做“http”工作的“完整”示例,然后回来更新UI。如何在Web服务调用线程完成后更新UI

我基本上在应用程序启动时调用一些Web服务。我显然不想冻结用户界面,所以我想要使用一个单独的线程,对不对?我在网上找到了大量关于如何获得新线程来执行某些任务的示例。但是我还没有找到一个展示如何在线程任务完成时实际更新UI的方法。

如何知道Web服务线程何时完成?有没有回调方法?如果存在,我可以使用此回调方法访问UI吗?

编辑:(下面是一些代码)

//The activate method is called whenever my application gains focus. 

public void activate(){ 

    DoSomething wsThread = new DoSomething(); 
    wsThread.start(); 
} 

public void wsCallBack() 
{ 
    myTabScreen.add(new ButtonField("Callback called")); 
} 

public class DoSomething extends Thread 
{ 
    public void run() 
    { 
     try 
     { 
      wsCallBack(); 
     } 
     catch(Exception e) 
     { 

     }   
    } 
} 

很简单。但它从不创建按钮。

任何想法?

非常感谢。

回答

3

您可以设置一个“回调”系统来在线程完成时通知UI。有一个扩展Thread的类并传递给最后应该调用的类的引用。如果您有需要通知的类的列表,请在线程实现上创建一个Vector来保存它们。重写run函数并完成你需要做的所有事情之后,只需在UI类上调用一个方法(如果需要,就遍历该向量)。所以,你的类可能看起来像:

public class commThread extends Thread{ 

    MyUIClass callbackObj; 

    public commThread(MyUIClass myUiClass){ 
     callbackObj = myUiClass; 
    } 

    public void run(){ 
     //do stuff 
     callbackObj.callback(); 
    } 

} 

和您的UI类:

public MyUIClass{ 

    public void callback(){ 
    //refresh the UI 
    } 
} 

当然,如果你有多个线程同时运行,并调用相同的用户界面对象一定要回调同步方法。

希望这会有所帮助!

+0

非常感谢回复。然而,我似乎无法从我的主线程的activate()方法启动新线程,这正是我最终要做的。这是不允许的? – PaulG 2011-12-22 16:52:39

+0

你可以发布一些代码和你尝试这样做时得到的错误吗?你的主线程的激活方法是什么意思? – Tamar 2011-12-22 18:11:29

+0

我上面编辑了我的问题以显示一些代码。谢谢 – PaulG 2011-12-28 13:52:42

相关问题