0

我的应用程序中有 GWT Timer,它应该每 15 分钟触发一次。这通常工作正常。但是,当 GwtFileupload对话框打开时,不会触发 TIMER。

下面给出的是一个描述我的问题的示例应用程序。在这里,我为每分钟安排了计时器。现在单击打开框Button的“选择文件..” 。保持打开状态超过一分钟。计时器没有被触发。我在 IE8/9/10 中检查了这个示例代码。在所有这些浏览器中,计时器都没有触发。FileuploadFileUpload Dialog

非常感谢任何帮助

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;

public class FileuploadEx implements EntryPoint{

@Override
public void onModuleLoad() {
    // TODO Auto-generated method stub
    FileUpload upload = new FileUpload();
    upload.setName("Select File..");
    VerticalPanel panel = new VerticalPanel();
    panel.add(upload);
    RootPanel.get().add(panel);
    Timer t = new Timer() {

        @Override
        public void run() {
            runAlert();
        }
    };
    t.schedule(60000);
}

public void runAlert(){
    Window.alert("Timer triggered");
    Timer t = new Timer() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            runAlert();
        }
    };
    t.schedule(60000);
}
}
4

1 回答 1

2

Javascript 是单线程的,因此某些对话框(如警报和确认)会停止主线程,并且在对话框关闭之前不会执行计时器。

但是,文件浏览器通常不会停止线程,至少在我测试过的浏览器(linux 中的 chrome 和 FF)中,这可能是您的浏览器或操作系统中的问题。

查看这个gwtupload示例,您可以看到,当您上传一个大文件(大约 800Mb,因为该示例限制为 1Mb)并打开浏览器选择器时,实际上使用计时器和 ajax 的进度条会继续更新。

[编辑] 在花费更多时间测试浏览器之后,现代浏览器可以工作,除了 IE 总是停止 javascript 线程。

我想除非微软修改他们的产品,否则这个问题没有解决方案。因此,您可以在代码中做的最好的事情是在文件选择器关闭时使会话过期。

与您的会话到期问题相关,我将按以下顺序执行:

  1. 根据不活动或固定期限使服务器端的会话过期,这样当客户端询问服务器时,它会收到错误并将用户带到登录屏幕或其他任何东西。这种方法更可靠,应用更广泛。

  2. 如果你想用 JS,在 var 中设置 session 的开始时间,然后运行一个周期性的计时器来检查 session 是否过期。打开文件对话框时,计时器不会运行,但一旦用户关闭对话框,它将收到会话过期的消息

    final double limit = 1000 * 60 * 15; // 15 minutes
    final double started = Duration.currentTimeMillis();

    Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() {
        public boolean execute() {
            double now = Duration.currentTimeMillis();
            if (now - started > limit) {
                // your code to remove session objects here
                Window.alert("Session expired");
                return false;
            }
            return true;
        }
    }, 1000);
于 2013-10-19T18:51:15.113 回答