如何在Web服务调用线程完成后更新UI

时间:2011-12-20 20:16:17

标签: multithreading blackberry

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

我基本上会在应用启动时调用一些Web服务。我显然不想冻结UI,所以我想使用一个单独的线程,对吧?我在网上找到了一些关于如何获得新线程来执行某项任务的示例。但我还没有找到一个展示如何在线程任务完成时实际更新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)
        {

        }           
    }
}

很简单。但它永远不会创建按钮。

有什么想法吗?

非常感谢。

1 个答案:

答案 0 :(得分:3)

您可以设置“回调”系统,以在线程完成时通知UI。有一个扩展Thread的类,并传递给应该在最后调用的类的引用。如果您有一个需要通知的类的列表,请在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
   }
}

当然,如果您同时运行多个线程并调用相同的UI对象,请确保同步回调方法。

希望这有帮助!