2012-06-04 49 views
0

我在onModuleLoad我的应用程序下面的代码():GWT-RPC延迟窗口刷新

Window.addWindowClosingHandler(new ClosingHandler() { 
     @Override 
     public void onWindowClosing(ClosingEvent event) { 
      event.setMessage("If you choose to close, application will sign out"); 
     } 
    }); 

    //sign out on close 
    Window.addCloseHandler(new CloseHandler<Window>() { 
     @Override 
     public void onClose(CloseEvent<Window> event) { 
      sendLogout(); 
     } 
    }); 

的sendLogout()函数如下:

// Set up the callback object. 
    AsyncCallback<String> callback = new LogoutCallback(this); 
    // Make the call to the survey service. 

    SurveySystemService.Util.getInstance().logout(details, callback); 

其中 '细节'是一些对象。

当窗口关闭时它工作得很好,但如果我尝试刷新页面,它不会注销。我的想法是,由于调用是异步的,在模块重新启动之前,它不会完成将消息传递到服务器。我试过了: 1.在onClose方法中创建并调用回调函数。 2.使用定时器来检查是否有呼叫。 3.检查与上述相同的无尽的厕所(我绝望)。

在所有这些解决方案中,程序都会到达回调创建,但服务器从未收到任何东西。

对此有何帮助?

回答

0

您是否可以在首次加载页面时调用注销。由于网络的无状态特性,GWT应用程序不会知道某人正在刷新或仅导航到页面。

您可以在会话存储中存储一个ID变量,该变量应保留,直到关闭浏览器窗口或选项卡。如果在应用程序启动时会话存储中存在ID变量,则可以使用它来触发注销。

+0

我最终使用Cookies来做你的建议,它的工作原理,谢谢!我从这个项目中学到的一个教训是,gwt-rpc是魔鬼:P – AoGenius