更新Vaadin进度与推异步(Update Vaadin Progressbar with push

2019-09-28 18:37发布

我计算文件的散列当一个问题,例如:MD5,SHA1,SHA256通过异步处理设置进度条的进度

感谢亚历杭德罗·杜阿尔特谁显示了一个非常实际的例子

https://github.com/newUserRepo/testbar/blob/issueBar/vaadin-upload/src/main/java/com/example/vaadinupload/ProcessingService.java#L44

我可以得到它的工作的唯一办法是,在法线75,我把4毫秒来处理任务,酒吧被更新,但实在是太慢了。

是的,我不睡觉线程应用程序不正确地做推动和改变不正确的客户端反映出来。

实际工作的另一种方法是用了Runnable接口,并在run()方法执行任务繁重

@Override
public void run() {
    calcularHash();
}

public void calcularHash() {

    System.out.println("Path tmp archivo: " + 
        tmpPath.toFile().getAbsolutePath());

    for(int f=0; f<hashType.size(); f++) {
        try (InputStream bis = new 
                  BufferedInputStream(Files.newInputStream(tmpPath))) {
            t.initTime();
            byte[] buffer = new byte[1024];
            MessageDigest messageDigest = 
             MessageDigest.getInstance(hashType.get(f));
            int dataRead = 0;
            long largo = tmpPath.toFile().length();
            Long acum = 0L;
            while ((dataRead = bis.read(buffer)) != -1) {
                messageDigest.update(buffer, 0, dataRead);
                acum += dataRead;
                Float per = ((float) acum / largo);
                bar.setValue(per);
                System.out.println(per * 100);
                //textFieldPercent.setValue(Types.formatPercentaje(per * 
           100));
            }
            final byte[] bytesDigest = messageDigest.digest();
            final StringBuilder sb = new StringBuilder();
            for (int c = 0; c < bytesDigest.length; c++) {
                sb.append(Integer.toString((bytesDigest[c] & 0xFF) + 0x100, 
               16).substring(1));
            }
            final String hashObtenido = sb.toString();
            t.finishTime();
            final String totalTime = t.getFinalTimeSec() + "seg " + 
                 t.getFinalTimeMs() + "ms";
            final String large = Types.getLargeFileFormat(largo);
            System.out.println(hashObtenido);
            ui.access(() -> {
                checksumTransactions.initData(messageDigest.getAlgorithm(), 
                                            sb.toString(),large, totalTime);
            });

           //Files.delete(tmpPath); //fixme borrar desde el grid o UI
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

在本图片我用一个简单的公共无效的run()和进度更新以及

但我们知道,应用程序可能会出现内存泄漏是不是一个好的做法,理想的是知道如何来执行后台线程

我仍然不知道实现这一目标的最佳途径:$

文章来源: Update Vaadin Progressbar with push asynchronously