Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vaadin 8:动态打开和关闭@Push以使用@Push和cookies_Cookies_Push_Vaadin8 - Fatal编程技术网

Vaadin 8:动态打开和关闭@Push以使用@Push和cookies

Vaadin 8:动态打开和关闭@Push以使用@Push和cookies,cookies,push,vaadin8,Cookies,Push,Vaadin8,在我的应用程序(Vaadin.8.6.3、Tomcat 9和Maven 3)中,我需要设置运行良好的cookies,除非我使用@Push。我只需要@Push来实现一个如上所述的进度窗口 我读到可以使用例如 getUI().getPushConfiguration().setPushMode(PushMode.AUTOMATIC) 我在代码中尝试了几种方法和位置来打开和关闭@Push,但都没有效果 一个例子: @Push(PushMode.DISABLED) public class MyUI

在我的应用程序(Vaadin.8.6.3、Tomcat 9和Maven 3)中,我需要设置运行良好的cookies,除非我使用@Push。我只需要@Push来实现一个如上所述的进度窗口

我读到可以使用例如

getUI().getPushConfiguration().setPushMode(PushMode.AUTOMATIC)

我在代码中尝试了几种方法和位置来打开和关闭@Push,但都没有效果

一个例子:

 @Push(PushMode.DISABLED)
public class MyUI extends UI {
因为我在代码中有不止一个地方处理cookies,所以我认为最好是在UI类中禁用@Push,并在运行后台线程时打开它

单击按钮,我启动runnable,并在runnable中打开@Push模式:

    class Loader implements Runnable {

    @Override
    public void run() {
        try {
            getUI().access(() -> {
                getUI().getPushConfiguration().setPushMode(PushMode.AUTOMATIC);
                getUI().getNavigator().navigateTo("scandataview/" + name);
            });

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
我没有错误,但什么也没有发生,即我想加载的数据永远不会加载,进度窗口永远保持不变

我的问题是:

是否可以在加载长数据时打开@Push以显示进度窗口,并在加载后将其关闭

如果是,我应该在代码中的什么位置打开/关闭@Push


如果你需要更多的信息,请告诉我。我将非常高兴你的帮助。谢谢大家!

如果您只需要在一个地方推一推,并且由于某种原因已经描述了并发症,我推荐以下方法

将推送模式设置为手动,即
@push(PushMode.manual)

然后对代码进行如下修改,即手动推送,不依赖自动推送

class Loader implements Runnable {

    @Override
    public void run() {
        try {
            getUI().access(() -> {
                getUI().getNavigator().navigateTo("scandataview/" + name);
                getUI().push();
            });

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

根据此问题中提供的信息,
access()
的上述使用可以进一步改进:

非常感谢您向我指出getUI问题!我添加了一个ui变量,该变量在构造函数中设置为ui=ui.getCurrent();然后你的代码就成功了。但是,通过设置@Push(PushMode.MANUAL),推送被启用,cookie设置不起作用!现在,我使用的是no-Push注释,然后我可以使用UI.getCurrent().getPushConfiguration().setPushMode(PushMode.MANUAL)打开和关闭推送;或PushMode.DISABLED。因为打开和关闭需要时间,所以我需要实现等待循环(肮脏的解决方法)。如何知道推送模式何时更改?