【问题标题】:Gwt timer doesnt work when FileUpload dialogbox is Opened打开文件上传对话框时获取计时器不起作用
【发布时间】:2013-10-19 17:54:39
【问题描述】:

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

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

非常感谢任何帮助

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);
}
}

【问题讨论】:

    标签: gwt


    【解决方案1】:

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

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

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

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

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

    与您的会话到期问题有关,我会按以下顺序进行:

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

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

        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);
    

    【讨论】:

    • 我在 IE8/9/10 中测试但无法触发计时器。我通过添加描述我的问题的示例代码修改了我的问题。请浏览一下
    • 我们应用程序中的计时器用于通知用户,说明他已在 15 分钟前登录并且会话即将到期。当 FILEUPLOAD 框打开时,此提示未到达用户
    • 你是对的,不管版本如何,线程总是在 IE 中停止。由于用户在打开文件时无法使用该应用程序,并且该应用程序已停止,因此我认为通知用户并在用户关闭对话框后立即使会话到期不是问题。更新了我的答案。
    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多