Javafx的WebEngine的url加载不输出结果坑,gc回收了局部变量

一、坑场景复现

源于w3cschool的JavaFX WebEngine测试例子,运行代码都没有输出,一直在研究为什么会出现这样的结果。

在测试过程中使用WebEngine的html加载,使用WebEngine的url加载,使用WebView加载url,使用仅Scene装载WebView(没有加入Stage或者没有运行stage.show()方法),还有使用Scene装载WebView(加入Stage并且运行stage.show()方法)等等,其中只有WebEngine的html加载Scene装载WebView(加入Stage并且运行stage.show()方法)有输出文档信息,其余都没有输出结果。

 

(1)代码对比

1、WebEngine 加载html

import com.sun.javafx.application.PlatformImpl;
import javafx.concurrent.Worker;
import javafx.scene.web.WebEngine;public class A {public static void main(String[] args) throws InterruptedException {PlatformImpl.startup(()->{doDom();System.err.println("finish");});}public static void doDom() {WebEngine webEngine = new WebEngine();webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {if (newValue == Worker.State.SUCCEEDED) {String html = (String) webEngine.executeScript("document.documentElement.outerHTML");System.out.println(html);System.exit(0);}System.out.println(newValue + " ");}); // addListener()String s="<html>\n" +"\n" +"<head>\n" +"<title>我的第一个 HTML 页面</title>\n" +"</head>\n" +"\n" +"<body>\n" +"<p>body 元素的内容会显示在浏览器中。</p>\n" +"<p id='a'>title 元素的内容会显示在浏览器的标题栏中。</p>\n" +"</body>\n" +"<script>var a =document.getElementById('a');\n" +"a.style.color='red';</script>\n" +"</html>\n";webEngine.loadContent(s);}
}

2、WebEngine 加载url

import com.sun.javafx.application.PlatformImpl;
import javafx.concurrent.Worker.State;
import javafx.scene.web.WebEngine;public class Test {public static void main(String[] args) throws InterruptedException {PlatformImpl.startup(() -> {doDom();System.err.println("finish");});}public static void doDom(){WebEngine webEngine = new WebEngine();webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {if (newValue == State.SUCCEEDED) {String html = (String) webEngine.executeScript("document.documentElement.outerHTML");System.out.println(html);System.exit(0);}System.out.println(newValue + " ");}); // addListener()webEngine.load("https://www.w3cschool.cn/java/javafx-webengine.html");}
}

(2)输出结果

1、WebEngine 加载html:

SCHEDULED 
RUNNING 
finish
<html><head>
<title>我的第一个 HTML 页面</title>
</head><body>
<p>body 元素的内容会显示在浏览器中。</p>
<p id="a" style="color: red;">title 元素的内容会显示在浏览器的标题栏中。</p><script>var a =document.getElementById('a');
a.style.color='red';</script></body></html>Process finished with exit code 0

2、WebEngine 加载url:

SCHEDULED 
RUNNING 
finish

程序运行不能结束。

如果在WebEngin类dispatchLoadEvent(long frame, int state, String url, String contentType, double workDone, int errorCode)方法里面debug运行,则输出

SCHEDULED 
RUNNING 
finish
<html>
...//内容太多此处省略
</html>Process finished with exit code 0

 

二、分析原因

通过run和debug模式的运行的结果不同,让我意识到WebEngine 变量是局部变量,里面的监听事件还没有执行完就被gc回收。

备注:Stage primaryStage是局部变量,没有调用show方法,很快就被gc回收,里面包含的WebEngine、WebView和Scene也会被gc回收,故看不到输出。

以前还有遇见过这样的现象,比如Javafx的MediaPlayer播放几秒钟音乐就停止了,因为这个有播放声音比较明显,可以找到是gc回收了MediaPlayer。

import com.sun.javafx.application.PlatformImpl;
import javafx.concurrent.Worker.State;
import javafx.scene.web.WebEngine;public class Test {public static void main(String[] args) throws InterruptedException {PlatformImpl.startup(() -> {doDom();System.out.println("finish");});}static WebEngine webEngine;//webEngine必须要有引用在使用,不能定义成局部变量,否则被gc回收就没有输出结果public static void doDom(){//WebEngine webEngine = new WebEngine();//以前定义成局部变量,被gc回收了webEngine = new WebEngine();webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {if (newValue == State.SUCCEEDED) {String html = (String) webEngine.executeScript("document.documentElement.outerHTML");System.out.println(html);System.exit(0);}System.out.println(newValue + " ");}); // addListener()webEngine.load("https://www.w3cschool.cn/java/javafx-webengine.html");//webEngine.loadContent(html);//直接加载html}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

layui结合ajax实现下拉菜单联动效果

大家好好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。昨天分享的是使用layui集合springboot实现图片上传&#xff0c;文章地址在这里&#xff0c;需要的小伙伴们可以去看看&#xff1a;今天给大家分享的内容也是那天在造项目的时候完成的&#x…

ASP.NET Core 源码学习之 Options[4]:IOptionsMonitor

前面我们讲到 IOptions 和 IOptionsSnapshot&#xff0c;他们两个最大的区别便是前者注册的是单例模式&#xff0c;后者注册的是 Scope 模式。而 IOptionsMonitor 则要求配置源必须是可监听的&#xff0c;用来实现 Options 实例的自动更新&#xff0c;并对外提供了 OnChage 事件…

P1967,ssl2267-货车运输【树上倍增LCA,最小生成树变形kruskal】

正题 题目链接&#xff1a; https://www.luogu.org/problemnew/show/P1967 大意 一个无向图&#xff0c;每个边有个权值&#xff0c;若干个询问&#xff0c;求两个点之间的一条最短路是这条最短路上的最小权值最大。 解题思路 首先我们发现其实每两个点之间留一条路径就好了…

易百教程——JavaFX教程

转载自 易百教程——JavaFX教程 JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API&#xff0c;我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序。JavaFX通过硬件加速图形支持现代GPU。 JavaFX允许开发人…

Springboot 2.x 单元测试 JUnit 5

https://www.cnblogs.com/xiaomaomao/p/14307749.html

Layui hint: Table element property lay-data configuration item has a syntax error解决方式

今天在使用layui的数据表格时&#xff0c;报错Layui hint: Table element property lay-data configuration item has a syntax error&#xff0c;找了好几中解决方式&#xff0c;网上说的用{}括起来。 对于我来说都不适应哎&#xff0c;我发现我的问题比较低级。 源代码&…

ASP.NET Core MVC – Form Tag Helpers

简介 我们已经介绍过Tag Helpers以及一些最常用的Tag Helpers&#xff0c;也谈到了缓存Tag Helpers。在这篇文章中&#xff0c;我们将讨论表单Tag Helpers。 HTML或Web表单通过使用各种HTML元素用于收集来自用户的输入&#xff0c;如输入框、复选框、单选按钮、下拉列表等。使…

POJ2752-Seek the Name, Seek the Fame【KMP】

正题 题目链接&#xff1a; http://poj.org/problem?id2752 大意 一个字符串&#xff0c;求所有的前缀等于后缀的长度 解题思路 用KMP求出Next数组。然后最大的那个肯定是长度&#xff0c;然后让jl&#xff0c;之后每次jnext[j]&#xff0c;直到j<0。 这里讲解一下原理…

表单提交报错405的解决方式

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。今天&#xff0c;分享一个bug的解决的方法&#xff0c;到最后解决了也不知道为啥这样是可以的&#xff0c;原来的方法是不可以的……01问题描述项目中有这样的一个需求&#xff0c;就是在原来的…

JavaFX图表(二)之饼图

翻译自 JavaFX - 饼图 饼图是将值表示为具有不同颜色的圆的切片。标记这些切片&#xff0c;并且在图表中表示与每个切片对应的值。 以下是一张饼图&#xff0c;描绘了一个实例中各公司的移动销售情况。 在JavaFX中&#xff0c;饼图由名为PieChart的类表示。该类属于包javaf…

RabbitMQ(mall项目学习 死信、延迟队列)

文章目录RabbitMQ的死信队列RabbitMQ的延迟队列mall项目 业务场景说明Rabbitmq 插件实现延迟队列启动&#xff08; UI 界面 &#xff09;RabbitMQ的死信队列 TTL&#xff1a;time to live 消息存活时间 如果消息在存活时间内未被消费&#xff0c;则会被清除 RabbitMQ⽀持两种…

asp.net中条件查询+分页

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。 今天&#xff0c;分享的是asp.net中条件查询分页的小案例。 如下图所示&#xff1a; 各个功能模块均已标注&#xff0c;先大致介绍一下业务。 \1. 点击左侧图书类别&#xff0c;根绝类别编…

POJ2406-Power Strings【KMP】

正题 链接&#xff1a; http://poj.org/problem?id2406 大意 一个字符串&#xff0c;求最小循环节。 解题思路 用KMP求循环节。 因为如果有循环节那么一定是l-next[l]。只需要判断一下l-next[l]是否可以被l整除就好了 代码 #include<cstdio> #include<cstring&…

.NET Standard@Xamarin.Forms

编者语 &#xff1a; .NET技术社群由于微软的开源和跨平台性越来越受关注&#xff0c;但国内都是碍于大家以往的认识阻碍了发展&#xff0c;没有太多大的企业敢于去把.NET作为第一生产力。你作为.NET程序员有义务去保护好你的饭碗&#xff0c;也要改变人对.NET的认知。希望大家…

JavaFX图表(一)

翻译自 JavaFX - 图表 通常&#xff0c;图表是数据的图形表示。有各种各样的图表来表示数据&#xff0c;如条形图&#xff0c;饼图&#xff0c;折线图&#xff0c;散点图等。 JavaFX支持各种饼图和XY图表。在XY平面上表示的图表包括AreaChart&#xff0c;BarChart&#xff0…

我们在进行着一场拔河比赛……

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。不知不觉&#xff0c;3班已经面临就业了。似乎每个班级到三期的最后阶段&#xff0c;出现的问题都那么类似&#xff0c;那就是一部分同学已经“放弃努力”了&#xff0c;大家貌似在等着最后的就业&…

JavaFX图表(三)之折线图

翻译自 JavaFX - 折线图 折线图或折线图将信息显示为由直线段连接的一系列数据点&#xff08;标记&#xff09;。折线图显示数据如何以相等的时间频率变化。 以下是描绘不同年份学校数量的折线图。 在JavaFX中&#xff0c;折线图由名为LineChart的类表示。该类属于包javafx…

Redis(案例一:注册登录-图形验证码+谷歌开源Kaptcha)

文章目录背景Kaptcha 框架介绍添加Kaptcha依赖Kaptcha配置CommonUtil⼯具类接⼝开发JsonData响应⼯具类封装校验逻辑背景 注册-登录-修改密码⼀般需要发送验证码&#xff0c;但是容易被攻击恶意调⽤ 什么是短信-邮箱轰炸机 ⼿机短信轰炸机是批、循环给⼿机⽆限发送各种⽹站的注…

释放.NET Big Memory和内存映射文件的能量

要点&#xff1a; 通常Web服务器具有的内存远远超过了.NET GC在正常情况下可以有效处理的量。缓存服务器的性能优势通常会因增加了网络成本而下降。内存映射文件通常是在系统重新启动后填充缓存的最快方式。服务器端调优的目的是出站网络连接达到饱和的程度。 通过最小化CPU、…

3班的第二次模拟面试

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。今天&#xff0c;三班进行了第二次模拟面试&#xff0c;还是和第一次一样&#xff0c;分为技术面试和人事面试&#xff0c;不过这次不一样的一点就是我亲自面的大部分开发学生。通过这次模拟面试&#…