Vaadin 基于 API 调用每 30 秒自动刷新网格数据

问题描述

我需要每 30 秒调用一次 API,并且需要使用更新的数据刷新网格。我使用服务器推送,但在我的情况下找不到最佳解决方案。下面是我的界面代码

@Route(value = UserNavigation.ROUTE)
@PreserveOnRefresh
@org.springframework.stereotype.Component
public class UserNavigation extends AppLayout {

CCUIConfig config;

    @Autowired
    public UserNavigation( CCUIConfig config) {
    this.config = config;

    addToDrawer(createAccordianMenu());
    }

    private Component createAccordianMenu() {
    VerticalLayout scrollableLayout = new VerticalLayout();

    Div kioskMonitor_div = new Div(kiosksMonitorLabel);
    kioskMonitor_div.addClickListener(event -> {
            try {
                setContent(new Monitor(config).getDashboard());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    scrollableLayout.add(kioskMonitor_div);
    return scrollableLayout;
    }
}


@Push
@Route
public class Monitor extends VerticalLayout{
    

    CCUIConfig config;
    Grid<Model> grid = new Grid<>();
    private FeederThread thread;
    

    public Monitor(CCUIConfig config) {
        this.config = config;
    }
   @Override
    protected void onAttach(AttachEvent attachEvent) {
        // Start the data feed thread
        super.onAttach(attachEvent);
        thread = new FeederThread(attachEvent.getUI(),grid);
        thread.start();
    }
   @Override
    protected void onDetach(DetachEvent detachEvent) {
        thread.interrupt();
        thread = null;
    }

    public  Component getDashboard() throws IOException{
        
        String updateddate =null;

        VerticalLayout dashboardview = new VerticalLayout();
        
        Grid.Column<Model> idColumn = grid.addColumn(Model::getid)
                .setHeader(ID);
        Grid.Column<Model> nameColumn = grid.addColumn(Model::getName)
                .setHeader(Name);
        Grid.Column<Model> memoryColumn = grid.addColumn(Model::getRefreshTime)
                .setHeader(Refresh time"));
        
        dashboardview.add(grid);
        return dashboardview;   
}
}
    


class FeederThread extends Thread {
    private final com.vaadin.flow.component.UI ui;
    private  final  Grid<Model>  grid;
    private final CCUIConfig config;

    private int count = 30;


    public FeederThread(com.vaadin.flow.component.UI ui,Grid<Model> grid) {
        this.config = new CCUIConfig();
        this.ui = ui;
        this.grid= grid;
    }

    @Override
    public void run() {
        while (count>0){
            try {
                Thread.sleep(1000);
                ui.access(()-> {
                    System.out.println("Thread Entry ");
                    try {
                    StringBuilder jsongrid = HttpClientGetRequestClient.executeUrlGet(config.getRefreshAPI());
                    ObjectMapper mapper = new ObjectMapper();
                    List<Model> userlist = new ArrayList<Model>();
                    String date="";
                    if(jsongrid!=null)
                    {
                    ModelWrapper eh = mapper.readValue(jsongrid.toString(),ModelWrapper.class);
                    userlist = eh.getMetricsData();
                    }
                                        
                    if(userlist != null)
                    {
                    grid.setItems(userlist);                
                    grid.getDataProvider().refreshAll();
                    }
                    }catch(JSONException |JsonProcessingException e) {
                        
                        e.printStackTrace();
                    } 

                });
                count--;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


        }
    }

}

UserNavigation 是用户登录后加载的页面,它包含一个带有多个选项(或功能)的侧边栏。其中一项功能是监视器屏幕。 Monitor 是带有网格的页面,我们需要在 30 秒内刷新它。 FeederThread是调用API异步更新网格中数据的线程类。

从上面的代码来看,会发生什么

onAttach(AttachEvent attachEvent)

没有被执行所以网格没有显示在页面上,我们使用 vaadin 14,任何帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...